From 489cae1a9ab804ebe04c8856b967b59d387c8479 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Mon, 24 May 2021 16:23:22 +0200 Subject: [PATCH] Basis of the project : background gestion for all menus, plane's animations and statistics menus --- Sources/CMakeLists.txt | 13 +- Sources/Plague.g1a | Bin 0 -> 41872 bytes Sources/assets-fx/avions.png | Bin 0 -> 677 bytes Sources/assets-fx/{img => }/fonds.png | Bin Sources/assets-fx/fonts/._plague.png | Bin 4096 -> 0 bytes Sources/assets-fx/fxconv-metadata.txt | 30 +- Sources/assets-fx/{icon-fx.png => icon.png} | Bin Sources/assets-fx/img/.DS_Store | Bin 6148 -> 0 bytes Sources/assets-fx/img/._.DS_Store | Bin 4096 -> 0 bytes Sources/assets-fx/img/._avions.png | Bin 4096 -> 0 bytes Sources/assets-fx/img/._fonds.png | Bin 4096 -> 0 bytes Sources/assets-fx/img/._muta.png | Bin 4096 -> 0 bytes Sources/assets-fx/img/._pieces.png | Bin 4096 -> 0 bytes Sources/assets-fx/img/._titre.png | Bin 4096 -> 0 bytes Sources/assets-fx/img/avions.png | Bin 1509 -> 0 bytes Sources/assets-fx/{img => }/muta.png | Bin Sources/assets-fx/{img => }/pieces.png | Bin Sources/assets-fx/{fonts => }/plague.png | Bin Sources/assets-fx/{img => }/titre.png | Bin Sources/src/core.c | 97 ++++ Sources/src/core.h | 67 +++ Sources/src/display_engine.c | 79 ++++ Sources/src/display_engine.h | 10 + Sources/src/main.c | 468 ++++---------------- 24 files changed, 370 insertions(+), 394 deletions(-) create mode 100644 Sources/Plague.g1a create mode 100644 Sources/assets-fx/avions.png rename Sources/assets-fx/{img => }/fonds.png (100%) delete mode 100644 Sources/assets-fx/fonts/._plague.png rename Sources/assets-fx/{icon-fx.png => icon.png} (100%) delete mode 100644 Sources/assets-fx/img/.DS_Store delete mode 100644 Sources/assets-fx/img/._.DS_Store delete mode 100644 Sources/assets-fx/img/._avions.png delete mode 100644 Sources/assets-fx/img/._fonds.png delete mode 100644 Sources/assets-fx/img/._muta.png delete mode 100644 Sources/assets-fx/img/._pieces.png delete mode 100644 Sources/assets-fx/img/._titre.png delete mode 100644 Sources/assets-fx/img/avions.png rename Sources/assets-fx/{img => }/muta.png (100%) rename Sources/assets-fx/{img => }/pieces.png (100%) rename Sources/assets-fx/{fonts => }/plague.png (100%) rename Sources/assets-fx/{img => }/titre.png (100%) create mode 100644 Sources/src/core.c create mode 100644 Sources/src/core.h create mode 100644 Sources/src/display_engine.c create mode 100644 Sources/src/display_engine.h diff --git a/Sources/CMakeLists.txt b/Sources/CMakeLists.txt index 25fd95d..1dd28a5 100644 --- a/Sources/CMakeLists.txt +++ b/Sources/CMakeLists.txt @@ -11,6 +11,8 @@ find_package(Gint 2.1 REQUIRED) set(SOURCES src/main.c + src/core.c + src/display_engine.c # ... ) # Shared assets, fx-9860G-only assets and fx-CG-50-only assets @@ -18,7 +20,12 @@ set(ASSETS # ... ) set(ASSETS_fx - assets-fx/example.png + assets-fx/plague.png + assets-fx/avions.png + assets-fx/fonds.png + assets-fx/muta.png + assets-fx/pieces.png + assets-fx/titre.png # ... ) set(ASSETS_cg @@ -33,8 +40,8 @@ target_compile_options(myaddin PRIVATE -Wall -Wextra -Os) target_link_libraries(myaddin Gint::Gint) if("${FXSDK_PLATFORM_LONG}" STREQUAL fx9860G) - generate_g1a(TARGET myaddin OUTPUT "MyAddin.g1a" - NAME "MyAddin" ICON assets-fx/icon.png) + generate_g1a(TARGET myaddin OUTPUT "Plague.g1a" + NAME "Plague" ICON assets-fx/icon.png) elseif("${FXSDK_PLATFORM_LONG}" STREQUAL fxCG50) generate_g3a(TARGET myaddin OUTPUT "MyAddin.g3a" NAME "MyAddin" ICONS assets-cg/icon-uns.png assets-cg/icon-sel.png) diff --git a/Sources/Plague.g1a b/Sources/Plague.g1a new file mode 100644 index 0000000000000000000000000000000000000000..d8677e137fe3c5af8753265457dd7b9c5e741cc5 GIT binary patch literal 41872 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 Z<-E?~a<iVc>l6a{+=?@{|#Xoie~@- literal 0 HcmV?d00001 diff --git a/Sources/assets-fx/avions.png b/Sources/assets-fx/avions.png new file mode 100644 index 0000000000000000000000000000000000000000..fae3c21925ca0e6cdcee66c30f80bf9a6c42486c GIT binary patch literal 677 zcmV;W0$TlvP)EX>4Tx04R}tkv&MmKpe$iQ%gl!9PCiUAwv}e3!);9T7@E12(?114knj=L6e3g z#l=x@EjakGSaoo5*44pP5ClI!+}xZLU8KbSrG*wT9vt`M-Mz=%J3weum}d2i1DbA| z>10C8=2pevD*}ij3_nI?W*Kvml!E8@x`&UicX6KOeeTZ@R`V7Ed?N8IGfbO!gLrz= zHaPDSM_5T#iO-40Ou8WPBiEG{zi}?QEbz>TnMuzRM~KB@7b{)NN~T6UMI2K#o$`fj zi&f5BoV7}gweQJa7|QD_%Uq{9gd`TR1PLM()KEqRHsZAEq*zGPe!{~)==vpcDdZ}H zkz)Z>Xpmh$_#gc4)+$U+w30#zAn@WiAHzU!7iiWU=lj@knkRt&8Mx9r{%Ql5`6RvG z(PBqH|2A-O-O-di;Bp6uJ{htpyON)#P$&TJXY@@uVBi+$TWj^!-pAQ(F$eAPg#I_rEgxX??Kzm`%*0Vgr$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt)MAgMTmK>)`Ie@l1c_f z1_J{NBWu$X6GICFV`J-p#LT>sq@vQ|4C}phjv&V{@Ov7ng6O1zoXp}91A_$|ARf?a zMhFcw0~K(7+VksHSNHq^r<($&=I5%k%uv3&Tj)NM;pTj^#CO4G)83Sw%My@z=rZRV zN6qF}a_{)0ABf*RCUkRN=Hj!Tv$z&*e7aPIH!ttA^~RV3@yl#lwl?pa?PIaD%>~t- zQQl|>jE2By2#kinXb6mkz-S1JhQMeDjE2By2n_EK0QI)uJubPBjLc$%qSWI2(xT*4 xg|z&lYz1HkE*04A%+E{A$*EMxNlhzJNXkjf%Lev^heODq`XBBi83wuk{{gNpk_`X= diff --git a/Sources/assets-fx/fxconv-metadata.txt b/Sources/assets-fx/fxconv-metadata.txt index d435d5f..8e3a371 100644 --- a/Sources/assets-fx/fxconv-metadata.txt +++ b/Sources/assets-fx/fxconv-metadata.txt @@ -1,3 +1,29 @@ -example.png: +plague.png: + type: font + name: font_plague + charset: print + grid.size: 5x5 + grid.padding: 1 + proportional: True + +avions.png: type: bopti-image - name: img_example + name: img_planes + +fonds.png: + type: bopti-image + name: img_bground + +muta.png: + type: bopti-image + name: img_mutations + +pieces.png: + type: bopti-image + name: img_pieces + +titre.png: + type: bopti-image + name: img_title + + diff --git a/Sources/assets-fx/icon-fx.png b/Sources/assets-fx/icon.png similarity index 100% rename from Sources/assets-fx/icon-fx.png rename to Sources/assets-fx/icon.png diff --git a/Sources/assets-fx/img/.DS_Store b/Sources/assets-fx/img/.DS_Store deleted file mode 100644 index 528637b0609f5a090e012a16e41a403e4d3f8076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKO-lnY5Pi`es$P2Zm|x%`g6E~KHxZ$Dw^~_5ZI}JH?@#y5Oe$Smud>KY$-HDf zlF5T68vtS1Z7zWYfH|9Bkj{vRdDL~3f(3)l@rnyn*rKf3k%^{glG;zu;*G7wLH*Bn zUDMX|UgHrBJvDWPHFwuy$M`L684BtK?`o?!eqh`VCG{Gg{E0W>Mm-<2mFQ@Tn*T!U zihR|&xXTTY72EG}P^C7Yc z<_UX4JvylL2|%3Dtiry$B_t;%%oFy8^iYDO5-l~PCq}Sz+GC2#6ZVFdj-V@Zp0x7* z@e*`(+M|Xe$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIhYCu0iY;W;207T zWIgNTe~1o-3apAo1xG_*Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLx9R5zz8%C zguy^ABqOs}p(wRDzqBYhRUs|EC|e;juOv0EBr`uRF(;=|AtyDhL?J0BF)tg~)rIOB Q(iE!y;a-tpko*510KSwTa{vGU diff --git a/Sources/assets-fx/img/._avions.png b/Sources/assets-fx/img/._avions.png deleted file mode 100644 index 77928275ef5305e86c09136b7842565b64c39cd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt)MAgMTmK>)`Ie@l1c_f z1_J{NBWu$X6QdMU(sq@vQ|4C`$#{(v0AkU0M&IB=2*ax#lc3=9@QEG91X;E^j xLRx-NwgRvNmkR85=I15mNl2;a=^?9AqO`(SNn9aaEFJYeTzcFo#l_Fxmg0YK*k74yyq zfYrqqTwleoWum{W+{rj3%Jl9Ds@W?XL zamL=_TymvrCBl$vap1N+E$jh3fWt*yCN#$yetesbPS3Q+E|sV}ey0Fz`)J?{!zeIa z9G54#_N!XO&hz8d4K{+_``gf{U&=&j+kV&1y;l~6@p1%gFIl`=Ge0&QoJb15H~6p?1WbF5XL8psLf%caB>_AS}7bMD2S;98;ir>MX(XsBzq=g^T+I_@F}jh@)3Lp z8(+gG@Cl5wUhWRXQn+Ro!Z))!JG1$9AFS=H!wSHVhwO61Zdkj_9&F<00CZkZG4H$s zSbdDa3sekSCi-ig`Tmvr^wvyozz5che$}mFZuYwX+hLIncv(s@c&K^BbDiV@k1R7C zXY4M{C0DvuB8s>cdtTeq!X9t{u)nCwgyvYoPw&#<`GpqQwGx%j?-hV;pE&MubmWBC z#r1fS>!7Mt>?Xa>TWkcA*Y2Uwpp=Qyw*9$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt)MAgMTmK>)`Ie@l1c_f z1_J{NBWu$X6QdM!GgIq;#LT>sq@vQ|4C|AYZ$XY>@M_~01kp(aIhn;J1_lc_Ks=z; zj1U@V1}fnEB%uAE=#;CyP1vH~=c-962C$;uzxVL|1$pDbyvxF6b8|Ls0gT&b(QC8|B6 zywMOC4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7~UZO>TSV$Tyh~9nZ*i4sm1xFMaiiO xY57Ij3cwCrDzMv`pO=`EQ>l=XnpUEal#`g34eSdKhmb+_Kio$$408Yf0{|ygk8c0~ diff --git a/Sources/assets-fx/img/._titre.png b/Sources/assets-fx/img/._titre.png deleted file mode 100644 index 2e062c840da4f68ac40dd81c56ad8a7ab4ab4f6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt)MAgMTmK>)4*6T9ODfe}J8z-TC!f%DU5zJ2Uz4HtJ^=T&8KTX%lN!%1u+*O}zyHff4YT=`Pj!*XJ( ziB!(MX02^|%s6g}Pn3iWA=P4F0rv8>onf=cg7CRpAf4wux>d~t8>TjpXJ#9QCm(anoHs|lY zuiQ_n<|h=MKJQ++Vb|LqW?!CFN>6z?^Wx2_eY~9UMYrB7zOPi>cl+GG-c#8T=d)k@ zw3TYQDDtg^xm?jQ;P)4$h{hDn6_Td+D!q9A-V_V$T%Rodq(*j6^n1-R_nSqPJgz$e zJ^T%C6-v zKkTGNpKh2y_JYbqR~%+aT$B@88Mx4~cI#BFX%ag(FHBvhQK3DN-rl0lSGwCZm=1Z-<7P7YL>{gS!O9g+Tv&3d? zzvH#MFXYw6Z2!BvzTY|Ru#Q)<@P)_Wwtkyay;5(Je>?QfJ5lS`Yqr%>N6&V5aPy5f zXIaj^c2PGLc|bmip$ynr`!+sBKm@=4&-tG11SWSItnMXKn=h-5YmL)}GSM z_@kTmN4qF-(QoM|hg`OwtbOvWDN6fww-WaSn^xmx?L09#0Wacioc^O$yOXy*>%sno z^?4Zz{vXU0|F9${N?Plm+oS?Y?MdG5EbH zUgGKN%Kn%~M1YA`OfMLiUznzPx;Tbth%$CDmHq{3hk^ev28d=t<{+~fp&Vq@U@;JZ zEC|yC(*Wk9D1gZz3&O-;x^dIUy1>pw7J##HxeCQKAk}ak$TngXL{@;G4f71LF)%T> zPGm_2T+U^LX+u^G6T@y4&KQI%C&Yl;g=`dD5UBe + +#include "core.h" + + +void next_frame(struct game *current_game) +{ + for (int i = 0; current_game->planes[i]; i++) + { + switch(current_game->planes[i]->direction) + { + case 1: + current_game->planes[i]->y -= 1; + break; + case 2: + current_game->planes[i]->x += 1; + break; + case 3: + current_game->planes[i]->y += 1; + break; + case 4: + current_game->planes[i]->x -= 1; + break; + } + if (current_game->planes[i]->x == current_game->planes[i]->dest_x && current_game->planes[i]->y == current_game->planes[i]->dest_y) + { + // Set the new destination + current_game->planes[i]->dest_x = current_game->planes[i]->depa_x; + current_game->planes[i]->dest_y = current_game->planes[i]->depa_y; + + // Set the new departure + current_game->planes[i]->depa_x = current_game->planes[i]->x; + current_game->planes[i]->depa_y = current_game->planes[i]->y; + + // Set the new direction + int new_dir = (current_game->planes[i]->direction + 2) % 4; + if (!new_dir) new_dir = 4; + current_game->planes[i]->direction = new_dir; + } + } + current_game->time += ENGINE_TICK; +} + + +int get_inputs(const int background, int *mutation_menu) +{ + int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS; + int timeout = 1; + + key_event_t ev = getkey_opt(opt, &timeout); + if(ev.type == KEYEV_NONE) return background; + + int key = ev.key; + + if (key == KEY_OPTN && (background == 1 || background == 2)) return (background % 2) + 1; + if (key == KEY_VARS) return 3; + if (key == KEY_SQUARE) return 6; + + if (key == KEY_EXIT) + { + if (background == 5) return 3; + if (background != 1 && background != 2) return 1; + if (background == 1) return -1; + } + + if (background == 3) + { + switch (key) + { + // Symptoms + case KEY_F1: + *mutation_menu = 1; + return 5; + break; + + // Abilities + case KEY_F3: + *mutation_menu = 2; + return 5; + break; + + // Transmission + case KEY_F5: + *mutation_menu = 3; + return 5; + break; + + // Return to the main menu + case KEY_F6: + *mutation_menu = 0; + return 1; + break; + } + } + + return background; +} diff --git a/Sources/src/core.h b/Sources/src/core.h new file mode 100644 index 0000000..cf3c806 --- /dev/null +++ b/Sources/src/core.h @@ -0,0 +1,67 @@ +#ifndef _PLAGUE_CORE_H +#define _PLAGUE_CORE_H + + +// Duration for internal clock +#define ENGINE_TICK 50 + +// Number of planes on screen +#define NB_PLANES 5 + +// Number of humans +#define TOTAL_POP 10000000000 + + +// game : all statistics of the current game +struct game +{ + // Disease parameters + int contagion, severity, lethality; + + // DNA points + int dna; + + // Mutations levels and sprite selected + int abilities, symptoms, transmission; + int abilities_sel, symptoms_sel, transmission_sel; + + // Research data + int research, limit; + + // Infectious pattern parameters + long long int healthy, infected, dead, cured; + + // Time + int time; + + // Planes + struct plane *planes[NB_PLANES + 1]; +}; + + +// plane : information about planes +struct plane +{ + // Plane's coordinates + int x, y; + + // Plane's direction + int direction; + + // Coordinates of the plane's destination + int dest_x, dest_y; + + //Coordinates of the plane's departure + int depa_x, depa_y; + +}; + + +// get_inputs : detect and manage inputs +int get_inputs(const int background, int *mutation_menu); + +// next_frame : compute the plane's positions +void next_frame(struct game *current_game); + + +#endif /* _PLAGUE_CORE_H */ \ No newline at end of file diff --git a/Sources/src/display_engine.c b/Sources/src/display_engine.c new file mode 100644 index 0000000..f81f69e --- /dev/null +++ b/Sources/src/display_engine.c @@ -0,0 +1,79 @@ +#include + +#include "core.h" +#include "display_engine.h" + + +void display_background(const int background) +{ + extern const bopti_image_t img_bground; + dsubimage(0, 0, &img_bground, 0, 65 * (background - 1), 128, 64, DIMAGE_NONE); +} + + +void display_foreground(const int background, const int mutation_menu, const struct game *current_game) +{ + extern const bopti_image_t img_mutations; + extern const bopti_image_t img_planes; + int length; + + switch (background) + { + case 1: + for (int i = 0; current_game->planes[i]; i++) + { + dsubimage(current_game->planes[i]->x - 4, current_game->planes[i]->y - 4, &img_planes, 0, 8 * (current_game->planes[i]->direction - 1), 8, 8, DIMAGE_NONE); + } + break; + case 2: + for (int i = 0; current_game->planes[i]; i++) + { + if (current_game->planes[i]->y + 8 < 53) dsubimage(current_game->planes[i]->x - 4, current_game->planes[i]->y - 4, &img_planes, 0, 8 * (current_game->planes[i]->direction - 1), 8, 8, DIMAGE_NONE); + } + + int length = 74 * current_game->research / current_game->limit; + dprint(9, 58, C_BLACK, "%d", current_game->dna); + + dline(51, 60, 51 + length, 60, C_BLACK); + dline(51, 59, 51 + length, 59, C_BLACK); + break; + + case 3: + dprint(102, 37, C_BLACK, "%d", current_game->dna); + + length = 67 * current_game->contagion / 26; + dline(57, 48, 57 + length, 48, C_BLACK); + dline(57, 49, 57 + length, 49, C_BLACK); + + length = 67 * current_game->severity / 20; + dline(57, 54, 57 + length, 54, C_BLACK); + dline(57, 55, 57 + length, 55, C_BLACK); + + length = 67 * current_game->lethality / 33; + dline(57, 60, 57 + length, 60, C_BLACK); + dline(57, 61, 57 + length, 61, C_BLACK); + + if (current_game->symptoms_sel) dsubimage(5, 15, &img_mutations, 0, 16 * (current_game->symptoms_sel - 1), 15, 15, 0); + if (current_game->symptoms_sel) dsubimage(35, 15, &img_mutations, 16, 16 * (current_game->abilities_sel - 1), 15, 15, 0); + if (current_game->symptoms_sel) dsubimage(65, 15, &img_mutations, 32, 16 * (current_game->transmission_sel - 1), 15, 15, 0); + break; + + case 6: + length = 63 * current_game->healthy/ TOTAL_POP; + dline(61, 31, 61 + length, 31, C_BLACK); + dline(61, 32, 61 + length, 32, C_BLACK); + + length = 63 * current_game->infected / TOTAL_POP; + dline(61, 39, 61 + length, 39, C_BLACK); + dline(61, 40, 61 + length, 40, C_BLACK); + + length = 63 * current_game->dead / TOTAL_POP; + dline(61, 47, 61 + length, 47, C_BLACK); + dline(61, 48, 61 + length, 48, C_BLACK); + + length = 63 * current_game->cured / TOTAL_POP; + dline(61, 55, 61 + length, 55, C_BLACK); + dline(61, 56, 61 + length, 56, C_BLACK); + break; + } +} \ No newline at end of file diff --git a/Sources/src/display_engine.h b/Sources/src/display_engine.h new file mode 100644 index 0000000..ddc805b --- /dev/null +++ b/Sources/src/display_engine.h @@ -0,0 +1,10 @@ +#ifndef _PLAGUE_DISPLAY_ENGINE_H +#define _PLAGUE_DISPLAY_ENGINE_H + +// Display the background +void display_background(const int background); + +// Display the foreground +void display_foreground(const int background, const int mutation_menu, const struct game *current_game); + +#endif /* _PLAGUE_DISPLAY_ENGINE_H */ \ No newline at end of file diff --git a/Sources/src/main.c b/Sources/src/main.c index 7067163..148c628 100644 --- a/Sources/src/main.c +++ b/Sources/src/main.c @@ -1,428 +1,118 @@ /* - Nom : Plague - Version : - dev- - Dernière modification : 28 Décembre 2019 - - Liste des choses à faire : - - Gestion des sélection dans les mutations et menu info - - Gestion des avions - - Moteurs du jeu (gestion du temps et sauvegarde) - - Gestion des pays à inclure dans le modèle infectieux - */ + Name : Plague + Version : - dev - + Last modification : 24 May 2021 +*/ #include #include -#include -#include +#include +#include + +#include "core.h" +#include "display_engine.h" -//display_barre : affiche les infos de la barre en dessous du monde -void display_barre (const int *adn, const int *recherche, const int *limite); +// title_screen : display the title screen +static void title_screen(void); -//display_menu : affiche les données sur l'écran menu du jeu à partir duquel on peut modifier la maladie -void display_menu (const int *adn, const int *contagion, const int *severite, const int *letalite, const int *sel_symp, const int *sel_capa, const int *sel_trans); +// main_loop : display background, foreground and manage inputs +void main_loop(struct game *current_game); -//display_info : affiche les infos sur la maladie selectionnée -void display_info (const char *nom, const int adn, const int conta, const int leta, const int sev); - -//display_stats : affiche les statistiques des humains -void display_stats(const double *sains, const double *infectes, const double *morts, const double *gueris, const double *total); - -//menu : gère les tableaux des mutations en fonction de la variable 'variable' -int menu (const int menu_muta, const image_t *img_fonds, const int nv_symp, const int nv_capa, const int nv_trans); - -//modele_infectieux : calcule la propagation de la maladie -void modele_infectieux (double *sains, double *infectes, double *morts, double *gueris, double *s_avant, double *i_avant, double *m_avant, double *g_avant, int *contagion, int *severite, int *letalite, int *changement); - -//floor : renvoie la partie entière d'une variable -double floor (double x); - -//init_mat : remplis la matrice dest à partir de src -void init_mat(int x, int y, int dest[][x], int src[][x]); - -//strcpy : copie une chaîne de caractère dans une autre -char * strcpy(char * dest, const char * src); - -//strtok : recherche les champs en fonction du séparateur -char * strtok(char * src, const char * separateur); - -//atof : convertit le texte en double -double atof(const char *nptr); +// callback_timer : basic timer +int callback_tick(volatile int *tick); -int main (void) +int main(void) { - extern const font_t font_plague; // Déclaration de la police custom - extern const image_t img_titre; // Déclaration de l'image-titre - extern const image_t img_fonds; // Déclaration des différents fonds du jeu - //extern const image_t img_avions; // Déclaration des avions - - dfont(&font_plague);// On change la police pour la police custom - - int fond = 1, fin = 0, key = 0, menu_muta = 0;//variables diverses pour le jeu - int recherche = 0, limite = 100, adn = 0, contagion = 0, severite = 0, letalite = 0, nv_symp = 1, nv_capa = 1, nv_trans = 1, sel_symp = 1, sel_capa = 1, sel_trans = 1;// Variables pour la maladie - double total = 10000000000, sains = total, infectes = 0, morts = 0, gueris = 0, s_avant, i_avant, m_avant, g_avant;// Variables pour les statistiques des humains - double changement = 0, priorite = 0;// Variables pour le modèle infectieux - - dclear(C_WHITE); - dimage(0, 0, &img_titre); - dupdate(); - getkey(); - // Fin de l'écran d'accueil - - while (fin == 0) + extern font_t font_plague; + dfont(&font_plague); + + title_screen(); + + struct plane plane_1 = {22, 20, 2, 84, 20, 22, 20}; + struct plane plane_2 = {34, 20, 3, 34, 44, 34, 20}; + struct plane plane_3 = {68, 44, 1, 68, 20, 68, 44}; + struct plane plane_4 = {104, 20, 3, 104, 50, 104, 20}; + struct plane plane_5 = {68, 44, 4, 34, 44, 68, 44}; + + GUNUSED struct game current_game = { - dclear(C_WHITE); - dsubimage(0, 0, &img_fonds, 0, 65 * (fond - 1), 128, 64, 0); - - switch (fond)// Affichage supplémentaires dépendant des fonds. - { - case 2: - display_barre(&adn, &recherche, &limite);// Monde avec la barre en dessous - break; - case 3: - display_menu(&adn, &contagion, &severite, &letalite, &sel_symp, &sel_capa, &sel_trans);// Menu de modification de la maladie - break; - case 6: - display_stats(&sains, &infectes, &morts, &gueris, &total);// Satistiques des humains - break; - } - - dupdate(); // Mise à jour de l'écran - key = getkey().key; - - switch (key) // Detection de la touche - { - case KEY_OPTN: - if (fond == 1) fond = 2; - else if (fond == 2) fond = 1; - break; - case KEY_VARS: - fond = 3; - break; - case KEY_SQUARE: - fond = 6; - break; - case KEY_F1: - if (fond == 3) menu_muta = 1; - break; - case KEY_F3: - if (fond == 3) menu_muta = 2; - break; - case KEY_F5: - if (fond == 3) menu_muta = 3; - break; - case KEY_F6: - if (fond == 3) fond = 1; - break; - case KEY_EXIT: - if (fond != 1) fond = 1; - else fin = 1; - break; - } - if (menu_muta != 0) menu_muta = menu(menu_muta, &img_fonds, nv_symp, nv_capa, nv_trans); - } - return 0; + .contagion = 0, + .severity = 0, + .lethality = 0, + + .dna = 0, + + .abilities = 1, .abilities_sel = 0, + .symptoms = 1, .symptoms_sel = 0, + .transmission = 1, .transmission_sel = 0, + + .research = 0, + .limit = 100, + + .healthy = TOTAL_POP - 1, + .infected = 1, + .dead = 0, + + .time = 0, + + .planes = {&plane_1, &plane_2, &plane_3, &plane_4, &plane_5, NULL} + }; + + main_loop(¤t_game); + + return 1; } -void display_barre (const int *adn, const int *recherche, const int *limite) +static void title_screen(void) { - // Recherche (jauge = 74 pxl) donc : 74 * (recherche / 100) pour le pourcentage - int variable; - char string[100]; - variable = 74 * *recherche / *limite; - sprintf(string, "%d", *adn); - dtext(9, 58, string, C_BLACK, C_NONE); - dline(51, 60, 51 + variable, 60, C_BLACK); - dline(51, 59, 51 + variable, 59, C_BLACK); -} + extern bopti_image_t img_title; - -void display_menu (const int *adn, const int *contagion, const int *severite, const int *letalite, const int *sel_symp, const int *sel_capa, const int *sel_trans) -{ - // toutes les jauges font 67 pxl de long. - extern const image_t img_muta; - int variable; - char string[100]; - sprintf(string, "%d", *adn); - dtext(102, 37, string, C_BLACK, C_NONE); - - variable = 67 * *contagion / 26; - dline(57, 48, 57 + variable, 48, C_BLACK); - dline(57, 49, 57 + variable, 49, C_BLACK); - - variable = 67 * *severite / 20; - dline(57, 54, 57 + variable, 54, C_BLACK); - dline(57, 55, 57 + variable, 55, C_BLACK); - - variable = 67 * *letalite / 33; - dline(57, 60, 57 + variable, 60, C_BLACK); - dline(57, 61, 57 + variable, 61, C_BLACK); - - dsubimage(5, 15, &img_muta, 0, 16 * (*sel_symp - 1), 15, 15, 0); - dsubimage(35, 15, &img_muta, 16, 16 * (*sel_capa - 1), 15, 15, 0); - dsubimage(65, 15, &img_muta, 32, 16 * (*sel_trans - 1), 15, 15, 0); -} - - -void display_info (const char *nom, const int adn, const int conta, const int leta, const int sev) -{ - char string[100]; - extern const image_t img_fonds; - extern const image_t img_muta; - dclear(C_WHITE); - dsubimage(0, 0, &img_fonds, 0, 195, 128, 64, 0); - - dtext(47, 25, nom, C_BLACK, C_NONE); - sprintf(string, "%d", adn); - dtext(73, 33, string, C_BLACK, C_NONE); - - sprintf(string, "%d", conta); - dtext(81, 41, string, C_BLACK, C_NONE); - - sprintf(string, "%d", leta); - dtext(74, 49, string, C_BLACK, C_NONE); - - sprintf(string, "%d", sev); - dtext(75, 57, string, C_BLACK, C_NONE); + dimage(0, 0, &img_title); dupdate(); getkey(); } -void display_stats (const double *sains, const double *infectes, const double *morts, const double *gueris, const double *total) +void main_loop(struct game *current_game) { - // Toutes les jauges font 63 pxl - int variable; - - variable = 63 * *sains / *total; - dline(61, 31, 61 + variable, 31, C_BLACK); - dline(61, 32, 61 + variable, 32, C_BLACK); - - variable = 63 * *infectes / *total; - dline(61, 39, 61 + variable, 39, C_BLACK); - dline(61, 40, 61 + variable, 40, C_BLACK); - - variable = 63 * *morts / *total; - dline(61, 47, 61 + variable, 47, C_BLACK); - dline(61, 48, 61 + variable, 48, C_BLACK); - - variable = 63 * *gueris / *total; - dline(61, 55, 61 + variable, 55, C_BLACK); - dline(61, 56, 61 + variable, 56, C_BLACK); - -} + int background = 1, mutation_menu = 0; + int end = 0; + static volatile int tick = 1; + int t = timer_configure(TIMER_ANY, ENGINE_TICK*1000, GINT_CALL(callback_tick, &tick)); + if (t >= 0) timer_start(t); -int menu (const int menu_muta, const image_t *img_fonds, const int nv_symp, const int nv_capa, const int nv_trans) -{ - extern const image_t img_muta; - extern const image_t img_pieces; - const char * sous_str; - int variable, contagion = 0, letalite = 0, severite = 0, cout_adn = 0; - double changement = 0.0; - int x = 0, y = 0, i, j, fin = 0, key = 0, lim = 0; - int tableau[4][8]; - - int symp_1[4][8] = {{1, 15, 15, 15, 3, 0, 0, 0},{0, 0, 15, 15, 0, 0, 0, 0},{0, 0, 15, 0, 15, 0, 0, 0},{0, 15, 15, 6, 15, 15, 0, 0}}; - int symp_2[4][8] = {{1, 2, 15, 4, 3, 0, 0, 0},{0, 0, 15, 15, 0, 0, 0, 0},{0, 0, 15, 0, 12, 0, 0, 0},{0, 15, 7, 6, 9, 15, 0, 0}}; - int symp_3[4][8] = {{1, 2, 5, 4, 3, 0, 0, 0},{0, 0, 15, 15, 0, 0, 0, 0},{0, 0, 15, 0, 12, 0, 0, 0},{0, 10, 7, 6, 9, 11, 0, 0}}; - int symp_4[4][8] = {{1, 2, 5, 4, 3, 0, 0, 0},{0, 0, 14, 13, 0, 0, 0, 0},{0, 0, 8, 0, 12, 0, 0, 0},{0, 10, 7, 6, 9, 11, 0, 0}}; - - int capa_1[4][8] = {{1, 0, 0, 0, 6, 0, 0, 0},{7, 7, 0, 7, 0, 0, 0, 0},{0, 0, 0, 0, 7, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0}}; - int capa_2[4][8] = {{1, 0, 0, 0, 6, 0, 0, 0},{2, 7, 0, 3, 0, 0, 0, 0},{0, 0, 0, 0, 7, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0}}; - int capa_3[4][8] = {{1, 0, 0, 0, 6, 0, 0, 0},{2, 5, 0, 3, 0, 0, 0, 0},{0, 0, 0, 0, 4, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0}}; - - int trans_1[4][8] = {{1, 14, 14, 0, 14, 5, 0, 0},{0, 0, 0, 14, 0, 0, 0, 11},{9, 14, 0, 0, 0, 0, 0, 14},{0, 0, 14, 14, 0, 0, 0, 14}}; - int trans_2[4][8] = {{1, 2, 14, 0, 6, 5, 0, 0},{0, 0, 0, 14, 0, 0, 0, 11},{9, 10, 0, 0, 0, 0, 0, 12},{0, 0, 0, 14, 14, 0, 0, 14}}; - int trans_3[4][8] = {{1, 2, 3, 0, 6, 5, 0, 0},{0, 0, 0, 14, 0, 0, 0, 11},{9, 10, 0, 0, 0, 0, 0, 12},{0, 0, 0, 7, 14, 0, 0, 13}}; - int trans_4[4][8] = {{1, 2, 3, 0, 6, 5, 0, 0},{0, 0, 0, 4, 0, 0, 0, 11},{9, 10, 0, 0, 0, 0, 0, 12},{0, 0, 0, 7, 8, 0, 0, 13}}; - - char element_sel[50], nom[50]; - const char *symptome[] = {"NAUSEE,1,1,0,0.5,2", "VOMISSEMENT,3,2,0,0.5,4", "TOUX,2,1,0,0.5,3", "PNEUMONIE,2,2,0,0.5,4", "TUMEURS,4,2,5,0.5,15", "PLAIE,2,1,0,0.5,3", "LESION,5,4,0,0.5,10", "HEMORAGIE,0,15,15,0.5,20", "INFLAMATION,2,2,2,0.5,5", "INFECTION,6,7,6,0.5,17", "SIDA,2,6,4,0.5,12", "PARANOIA,0,4,1,1,5", "FOLIE,6,15,0,2,20", "CYROSE,0,20,25,0,30"}; - - switch (menu_muta)// Remplissage de la matrice pour afficher les mutations + while (!end) { - case 1: - lim = 15; - switch (nv_symp) - { - case 1: - init_mat(8, 4, tableau, symp_1); - break; - case 2: - init_mat(8, 4, tableau, symp_2); - break; - case 3: - init_mat(8, 4, tableau, symp_3); - break; - case 4: - init_mat(8, 4, tableau, symp_4); - break; - } - break; + // Real-time clock system + while (!tick) sleep(); + tick = 0; - case 2: - lim = 7; - switch (nv_capa) - { - case 1: - init_mat(8, 4, tableau, capa_1); - break; - case 2: - init_mat(8, 4, tableau, capa_2); - break; - case 3: - init_mat(8, 4, tableau, capa_3); - break; - } - break; - - case 3: - lim = 14; - switch (nv_trans) - { - case 1: - init_mat(8, 4, tableau, trans_1); - break; - case 2: - init_mat(8, 4, tableau, trans_2); - break; - case 3: - init_mat(8, 4, tableau, trans_3); - break; - case 4: - init_mat(8, 4, tableau, trans_4); - break; - } - break; - } - - while (fin == 0) - { + // Update the screen dclear(C_WHITE); - dsubimage(0, 0, img_fonds, 0, 260, 128, 64, 0); - - for (i = 0 ; i <= 7 ; i++) - { - for (j = 0 ; j <= 3; j++) - { - if (tableau[j][i] != 0) dsubimage(16 * i, 16 * j, &img_muta, 16 * (menu_muta - 1), 16 * (tableau[j][i] - 1), 15, 15, 0); - } - } - - if (tableau[y][x] == lim) dsubimage(16 * x - 1, 16 * y - 1, &img_pieces, 0, 18, 17, 17, 0); - else dsubimage(16 * x - 1, 16 * y - 1, &img_pieces, 0, 0, 17, 17, 0); + display_background(background); + display_foreground(background, mutation_menu, current_game); dupdate(); - key = getkey().key; + + // Compute the motion of planes + next_frame(current_game); - switch (key) - { - case KEY_LEFT: - if (x > 0) x -= 1; - break; - case KEY_RIGHT: - if (x < 7) x += 1; - break; - case KEY_UP: - if (y > 0) y -= 1; - break; - case KEY_DOWN: - if (y < 3) y += 1; - break; - case KEY_EXIT: - fin = 1; - break; - case KEY_EXE: - if (tableau[y][x] != lim && tableau[y][x] != 0) fin = 2; - else fin = 0; - break; - } + // Get inputs from the keyboard and manage it + background = get_inputs(background, &mutation_menu); + if (background == -1) end = 1; } - if (fin == 2) - { - switch(menu_muta) - { - case 1: - strcpy(element_sel, symptome[tableau[y][x] - 1]); - break; - } - variable = 0; - while(1) - { - if(variable == 0) sous_str = strtok(element_sel, ","); - else sous_str = strtok(NULL, ","); - variable ++; - - switch (variable) - { - case 1: - strcpy(nom, sous_str); - break; - case 2: - contagion = floor(atof(sous_str)); - break; - case 3: - severite = floor(atof(sous_str)); - break; - case 4: - letalite = floor(atof(sous_str)); - break; - case 5: - changement = atof(sous_str); - break; - case 6: - cout_adn = floor(atof(sous_str)); - break; - - - } - - if(sous_str == NULL) break; - } - display_info (nom, cout_adn, contagion, letalite, severite); - - - } - - - - return 0; + if (t >= 0) timer_stop(t); } -void modele_infectieux (double *sains, double *infectes, double *morts, double *gueris, double *s_avant, double *i_avant, double *m_avant, double *g_avant, int *contagion, int *severite, int *letalite, int *changement) +int callback_tick(volatile int *tick) { - double r = *contagion / 2600, a = *severite / (200 - *changement), b = *letalite / 3300; - - *sains = floor(*s_avant - r * *s_avant); - *infectes = floor (*i_avant + r * *s_avant - *i_avant * b - *i_avant * a); - *morts = floor (*m_avant + *infectes * b); - *gueris = floor(*g_avant + *infectes * a); - - *s_avant = *sains; - *i_avant = *infectes; - *m_avant = *morts; - *g_avant = *gueris; -} - - -double floor (double x) -{ - return (int)x; -} - -void init_mat(int x, int y, int dest[][x], int src[][x]) -{ - for (int i = 0 ; i < x ; i++) - { - for (int j = 0 ; j < y ; j++) - { - dest[j][i] = src[j][i]; - } - } + *tick = 1; + return TIMER_CONTINUE; }