From cfbec41c4410c5fd456bc93cd8ed8bcbc1342dfe Mon Sep 17 00:00:00 2001 From: Anselme Date: Mon, 16 May 2016 17:50:27 +0200 Subject: [PATCH] added generators to the list of things to select, worked on the rendering --- CMakeLists.txt | 2 +- generators/anselme.cpp | 69 ++++++++++++ generators/anselme.dll | Bin 0 -> 43834 bytes generators/bis.c | 131 ++++++++++++++++++++++ generators/default.c | 234 ++++++++++++++++++++++++++++++++++++++++ generators/hello.dll | Bin 0 -> 43091 bytes shaders/pixel.vert.glsl | 2 +- shaders/world.frag.glsl | 7 +- src/drawwidget.cpp | 44 +++++--- src/drawwidget.h | 13 ++- src/dude.cpp | 6 ++ src/dude.h | 20 ++++ src/libwidget.cpp | 57 ++++++++-- src/libwidget.h | 14 ++- src/libwidget.ui | 67 +++++++++--- src/mainwindow.cpp | 2 + src/map.cpp | 21 +++- src/map.h | 56 ++++++---- src/mapscene.h | 12 +++ src/pixelpipeline.cpp | 131 +++++++++++++++------- src/pixelpipeline.h | 4 +- src/team.cpp | 3 + src/team.h | 115 ++++++++++++++++++++ teams/hello.cpp | 1 - teams/hello.dll | Bin 0 -> 43078 bytes teams/plop.dll | Bin 0 -> 43078 bytes teams/truc.dll | Bin 0 -> 43078 bytes 27 files changed, 896 insertions(+), 115 deletions(-) create mode 100644 generators/anselme.cpp create mode 100644 generators/anselme.dll create mode 100644 generators/bis.c create mode 100644 generators/default.c create mode 100644 generators/hello.dll create mode 100644 src/dude.cpp create mode 100644 src/dude.h create mode 100644 src/mapscene.h create mode 100644 src/team.cpp create mode 100644 src/team.h create mode 100644 teams/hello.dll create mode 100644 teams/plop.dll create mode 100644 teams/truc.dll diff --git a/CMakeLists.txt b/CMakeLists.txt index d885937..e21df28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 2.8) # choose source file file(GLOB EXEC_SRC_LIST src/*.cpp) -file(GLOB RESOURCES_FILES resources.qrc src/*.ui shaders/*.glsl) +file(GLOB RESOURCES_FILES src/*.h resources.qrc src/*.ui shaders/*.glsl) set(EXTRA_INCLUDES src) diff --git a/generators/anselme.cpp b/generators/anselme.cpp new file mode 100644 index 0000000..9d0b6d7 --- /dev/null +++ b/generators/anselme.cpp @@ -0,0 +1,69 @@ +#include +#include +#include + +// g++ -shared anselme.cpp -o anselme.dll -I../src + +// functions +int distance_manhattan(int x1,int y1, int x2, int y2) +{ + return abs(x1-x2) + abs(y1-y2); +} + +inline int custom_min(int a, int b) +{ + return a < b ? a : b; +} + +inline int custom_max(int a, int b) +{ + return a > b ? a : b; +} + +extern "C" void generate(Map *mapPtr) +{ + Map &map = *mapPtr; + int w = map.getWidth(); + int h = map.getHeight(); + int n = map.getNbTeams(); + int i,j, k; + int r = (w/n < h ? w/n : h)/2; + int *teamCoord = new int[n*2]; + + for(i=0; i r+15) // mountain + map[i][j].type = rand()%8 ? Pixel::ROCK : Pixel::IRON_ORE; + else if(l < r-15) // plains + map[i][j].type = rand()%15 ? Pixel::GRASS : Pixel::BERRIES; + else // forest + { + l = rand()%10; + map[i][j].type = l > 5 ? Pixel::TREE : l ? Pixel::GRASS : Pixel::BERRIES; + } + } + } + } + } +} diff --git a/generators/anselme.dll b/generators/anselme.dll new file mode 100644 index 0000000000000000000000000000000000000000..19e226429d4489c0b678dd87cc26f21f2ed82df6 GIT binary patch literal 43834 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 KI!?$>q5ePX)L{z% literal 0 HcmV?d00001 diff --git a/generators/bis.c b/generators/bis.c new file mode 100644 index 0000000..a0af3c4 --- /dev/null +++ b/generators/bis.c @@ -0,0 +1,131 @@ +#include "main.h" + +#include + +#ifndef MAX + #define max( a,b ) ( ((a) > (b) ) ? (a) : (b) ) +#endif + +//variables +int width, height, size; +float corner_value[4]; + +//functions +int closest_pow_2(int); +void init_height_map(float**); +void start_diamond_square(float**); +void diamond_square(float**,int,int,int,int); +float average(float,float); +float average_noisy(float,float); +float average_t(float*, int); +void apply_noise(float*); + +void create_map(int w, int h){ + width = w; + height = h; + + int i; + float** height_map; + + size=closest_pow_2(max(w,h)); + + height_map = (float**) malloc(sizeof(float*)*(size+1)); + for(i=0;i<=size;i++) + height_map[i]=malloc(sizeof(float)*(size+1)); + + printf("init height map...\n"); + init_height_map(height_map); + + printf("generate height map...\n"); + //generate height map + start_diamond_square(height_map); + + printf("erosion\n"); + + + + printf("finished generation! \n"); + +} + +int closest_pow_2(int x){ + return pow(2,floor(log(x)/log(2))+1); +} + +void init_height_map(float** h_map){ + h_map[0][0]=0.7; + h_map[size][0]=0.3; + h_map[size][size]=0.9; + h_map[0][size]=0.8; +} + +void start_diamond_square(float ** h_map){ + diamond_square(h_map,0,size,0,size); +} + +void dummy(int x1, int y1, int x2, int y2, int avg_x,int avg_y){ +} + +void diamond_square(float** h_map,int x1,int x2,int y1, int y2){ + int avg_x, avg_y; + float avg_value; + + //get value of corner from h_map + corner_value[0] = h_map[x1][y1]; //up_left + corner_value[1] = h_map[x2][y1]; //up_right + corner_value[2] = h_map[x2][y2]; //down_right + corner_value[3] = h_map[x1][y2]; //down_left + + //process coordinate of center + avg_x = average(x1,x2); + avg_y = average(y1,y2); + + //dummy(x1,y1,x2,y2,avg_x,avg_y); + //Diamond Step + //process average value of the corner + avg_value = average_t(corner_value,4); + + apply_noise(&avg_value); + //affect value + h_map[avg_x][avg_y]=avg_value; + + // Square Step + //update value of the four mid-point between corner, following clockwise orde, and adding noise + h_map[avg_x][y1] = average_noisy(corner_value[0], corner_value[1]); // up + h_map[x2][avg_y] = average_noisy(corner_value[1], corner_value[2]); // right + h_map[avg_x][y2] = average_noisy(corner_value[2], corner_value[3]); // down + h_map[x1][avg_y] = average_noisy(corner_value[3], corner_value[0]); // left + + //recursive call to diamond_square + int offset = x2-x1; + + if (offset > 2){ + diamond_square(h_map, x1, avg_x, y1, avg_y); //up_left square + diamond_square(h_map, avg_x, x2, y1, avg_y); // up_right square + diamond_square(h_map, avg_x, x2, avg_y, y2); // down_right square + diamond_square(h_map, x1, avg_x, avg_y, y2); // down_left square + } +} + +float average(float a, float b){ + return (a+b)/2; +} + +float average_noisy(float a, float b){ + float value = average(a,b); + apply_noise(&value); + return value; +} + +float average_t(float* tab, int size){ + int i; + float avg_value=0; + for(i=0;i not used for now +enum{ + FLAT, VALLEY, +}; + +//biome type +enum{ + VILLAGE, PLAINS, FOREST,MOUNTAINS,NB_BIOMES +}; + +// probability for each biomes +// in following order {GRASS,TREE,BERRIES, ROCK, IRON_ORE} +char proba_table[NB_BIOMES][5] = {{97,2,1,0,0},{85,13,2,0,0},{40,40,20,0,0},{0,0,0,80,20}}; + +typedef struct{ + int x; + int y; + int type; + int power; + int radius; +} t_biome; + +// variables +int sp_x[NB_TEAMS], sp_y[NB_TEAMS]; +t_biome* l_biomes; +int size_biomes; +int nb_plains, nb_forests, nb_mountains; +int cpt_biome = 0; +int width, height; + +// functions +int distance_manhattan(int x1,int y1, int x2, int y2); +int absolute(int val); +void set_spawns(t_pixel** map, t_team* teams); +void create_biome(int x, int y, int type); +void create_biome_random(int type); +int check_nears_biomes(int x, int y); +int check_nears_spawn(int x, int y); +int in_radius(int x,int y,t_biome e); +int generate(int x, int y); +void init_generator(); + +void create_map(int w, int h){ + int i,j; + + //biome variable + + width = w; + height = h; + + init_generator(); + + //Epicenters generation + // random choice for numbers of biomes + nb_plains = (rand()%MAX_EPICENTER_BY_TYPE)+3; + nb_forests = (rand()%MAX_EPICENTER_BY_TYPE)+3; + nb_mountains = (rand()%MAX_EPICENTER_BY_TYPE)+3; + + size_biomes = nb_plains+ nb_forests + nb_mountains + NB_TEAMS; + + l_biomes = malloc(sizeof(t_biome)*size_biomes); + + // Spawn generations + set_spawns(map,teams); + + for(i=0;ix=x; + biome->y=y; + biome->type = type; + + switch(type){ + case VILLAGE: + biome->power = (rand()%MAX_POWER)+1; + biome->radius = (rand()%(25-10))+10; + break; + case PLAINS: + case FOREST: + case MOUNTAINS: + default: + biome->power = (rand()%MAX_POWER)+1; + biome->radius = (rand()%(OFFSET_RADIUS))+MIN_RADIUS; + break; + } + + l_biomes[cpt_biome++]=*biome; +} + +void create_biome_random(int type){ + int x,y; + do { + x=rand()%width; + y=rand()%height; + } while ((check_nears_biomes(x,y) != 0) || (check_nears_spawn(x,y) != 0)); //prevent biome superposition + + create_biome(x,y,type); +} + +int check_nears_biomes(int x, int y){ + int i, c=0; + for(i=0;i 0 ? val : -val; +} diff --git a/generators/hello.dll b/generators/hello.dll new file mode 100644 index 0000000000000000000000000000000000000000..d39bc3c6be3217e4e160419792cf0dcd4c73ae6f GIT binary patch literal 43091 zcmeHw4PaZ}yl;%MezZ$Qy0MLwtYeTCXiaSLQ_|w5`5;{=OShCdb;?5NXg;9md){;I zkFKt5AobdB9Va=y_rB*n@85aPd(J(&_nuYjhlEr?5RAz2xF8(Hk&>PLo&L`*6ldM^ z%`D-mtG;{lVMD`rZ}x2J3Yi1JzRsYx$L#a=_V$I%ZGLmGzt`N=Yp!i_n|u1&{e^Sp zq~}Ydo1KEtV94fI9zoa-Va^G&Zq6{I=uO4N#HW5 zFznwJ#>HV-FVa;}f@5tInl~1`c4QMWtAwMJ zfM;J~;}^rTaco8=ynGIm{}NtdTPQ@=A|-f&?}i-(|$#1KwM-%^68iRl~eX7ZT{ydRnH%8(Nh!wdSm`+Nd#!$T+} z8uB@|Ja3`>LoTSyWC5E z&mj}NM&yLV@JdP;B-en$C1k>DW+3Gc!z*3NuDOapCcG8}g`JQdTF8fAxg!_zjv4cJ z0drh{FGh{|(UI|2;2i^JA3N!@w>@?of5LN)ksk<=(LC$$-6J?0CVB538ETFGWX)<2 znICJ-95~g#>431&-Zn6t{opJhM8*x)v$2x!Zjd4P#GE1UBA1H461iynCeetVxs?5n zxnp25Fx>y+1E+Bkxtx-{=LaYQ@=Z95_g#yQLdb*uU*3I>_}L?wLgZZogY;i)KS2G@ z`c7=EF;+#aCgzr($=+iEzRc`ZFpFLSpBp7UuUpSboDA7}<^z*mLF_#jK}#*V21NsB zv-cb&XxL6NhUdjvbB@*K8>s=Jo_tfR)fAnZA0LZc%#5UwmRvAZRO|4C+IT!Z_%tdA z2gs%{^0*HjbznGpH0(G)7A8KJ()0f+H(DBu;zCKp};O7xw<=RSiAf&3%-^6KbO zck~DFl7UmvT%*O_*54pGO1O9YdN^BjXTFKZQWa9Q6(nKM=#j{Kso8tJ2dLZ($I_@i z#E-+m(J^ud_$w?oSQC$2Hf${>Qqc|hMj~_1uj6r$LBkHb2pWT11na4Z=OgbKvIpMd z*W=G##ktE>&gL-AXqqGa_cP4x;FT=jKXa^P@Yf~>zxsYWZaqZ~0&ND0BziK(?P?_n z6m^~-e++eEt>>BahaszwT|0ImPNq%JZ@DaN_P}RAm5Dn~FD}t@EA%dWL!zR1F)Vc+ zLohS=g+E3q3?;Q6^=wam{;@O*Je$No$3qur$S;W1=9|ZF1af3_K04&!Q=g_{^oY#y zy$J58l{xV$#Rm!xIk6j?(KX>p0(w#W2hpSGl7|o9iXQb&c%cl=-2@yIJT?j+Ch4vP zGTJeo>tO{Zbib>a_dys`I^PUhV+Zo!5GW}FWFeyt5(C5EByqym5&BXhV^qmRkDzZ| z1$3$zKQ-vTeD^({9bx?e^74qtkbwxV0b#rsqT*b*4syOQ9>5ito)}@srfuxXE6Q%iD<-g4?D4j|X;% zAMBMEsmg?3r4Ze4`mr>20pT&Mg|9}43NMSu<0tyfvjs!;w%za1-|$a6hGMA@B?Y6& zh>-*Pf1Zd<`W8@&!X{*76Rw$ZM#wbrHyuOPVcFBTzoFbXLV;eAk6lZ?NC%Slz@xAo zh?;Hy(ZLPq?Ggi6eH*+qGHeH{%<;TTbZg?b0d@cit4D>fi4kSvv+)OGd}4wNuc7E4 zxmbCi41P>gg9)&S zSoWSDk!-fRV>eR07v4xQydAAE@mb0EGl=1-D>I`t#zE&vCK(}-Ml=JC)mn@YF`m1R zT!co0a46cYug6S*Y1ont=9{jJAa$ayZ`z z*h7GgcTf!G^937fLE_mX{F>Pl)@(SIMkVA1<9RUBpwT{P9QXrVM$TOte**?N##949 zSU8FvcN5@`kqC!9b@sN!mG~36JUjcr|4mgcXJkLv3R(vUOrzx>pa<;I#V%aLs%mld zY(0VE*?SfP`B_4a)tKPY*#qYRh>T?Jevhb!T(OK88skp|0T|z)ztPsw?5EwP!9#Qr zc{e9}54mvUU32!H&#@Cz_MYW9K_4S4)H+~=jTpVJzb$F*0I`JxsI)AE3Xf z?#t2Elj9Gf2HJ+>MOjJk6!Sal*@5BD&zU#`_gZ!%wfTKtWeqY|dH100c_=6tF2!;% zEWAFr>ZI&B(FQcNJ;{0a)O65!91Wbw8`XFi=O%cH>>K25l3z>=ayu0dypuh!41N&1 z(>QPbD&VB~=wYOzIGu9Dxjz-52+~V<$$bF+icKulN(!%fT{uz}U-X#V9 z0i$^KGtQG8(OHVMv+sY9Xyp>Er)On9Jr@1`?h~L9-!q(D|NZEt+gnF@m;!hGT*ZHZ#NJ(m8s@g~({;+bj%GyoueoKOau;UOb#Xa5kJBpZjHY zJz>DKqyH^Xx6cRl>UU{sk$3lq_3T7SbY!r`5Su$dh`7zTG;vf4^9SsZnfk}ueEdF^ zMgTaHF!2z@A-TUSI*3fq8X|E)}kxN z`p?Afd(HX*M&o#HEdbGxcy2u%ou}iu8`#O%pz|E7(2dLD{&U6s=dG_7_n$_c;{LJS zA223)(M!J?i4_*K5+HW;Mkco2?rrD5R5OW#_TaD4&d@p29vtvSWl~KSf zzZPet+hchsc&q_eF()+7 z=!r6ue;X??jXN-zRzkRJzxg2WIQYeL%YYWE+E2VoDBOYgKs;=b+9Nib(b~xiV6Iot z{F!KGggj$(KJJrZpEnJ}`(IV)wR2S2{QB`@we=l%P0oRXUP1gzLq1A14@KC=zgAyzfrwjkcNs1Eh0`!q=@{zRy)7@pfJqrTx36U@2tTMDR~1w@6VbzhWW!$Lu90&{LRp(X%NA{Ot-e=_~R*H zga&_|h`%n82ma`M>pOQxFA+2HXSeli zMdk4yqmZyi*u+>e8|bOTj4Gutr}QS%DEpa5W)T(efprvoH_V(FP9s?*{>yo-pL09x zOR&SB$B>u(jBD1wiSWzT;diP(V-C+oub&&4Knq|-S5SUDc)|J(qZNIH9oYPOD)~;s zZ3c#!*4YTikc@k|byyKEoJ#YxizaTG$5@5%0+=RKXPTqD@S2!C|5sx#jNb$^DfA|O zk=TFMSmSiRs)FtC~Kf! z^k+&JnyY9%d$1utGnl*k0-Z;$5*E{u6>ObY_yPcH*WtDRy={nfT--71=kl4PpXtA}hy}Mfw#h|~lD-`wz#SZ+A=NG$rJNg8Mc<*9sF~_-Mi`XJz)pUD9 zA%6(<+WnK&6zcum-F@aYeZlT_^UW|w^QSP(cJ+2{UA(o_Mn4XQyL$ZQ4sTa?f6!l% zE;!oTgZ@y+ydYrSX>gyHE=G9%naKE?vu6}=TJFDn#H+S>} z%?sMiZQH~Ckl7nHdlf3w21=dgU|$$?Kdto}GJ$0S7uCO`OwZkvt+A+)8xY6F$e8Uo9 zWlc?mxuC1GtaNdpFVwYdar;(puw!x1zs0i1T;1Q*jUP|9n_;PyYZkA8rNIAQh`!Kl zD=aH47N)6h{jmDwg+>3B^?y_OKdJwlwf`sf``y~_H|>AF>-PI-@>5);L^p)5?G}XH zx$J2R2K(gCe-8`bCx4aF(KTXah({t=it$Dy$1Bz=B>Nqlhl81Z}xp_pA7oz&ovy6A3 za4H>f|IBpUfI5GVbA^xdfz*gGWj_f`B9k3xLVO;0>k{!&TB&$S`c#i{=4d>Q+jNzF z7pum~DgnM8<@m8(EpJrIHvpV5P5qrH&qF!!QRH9C>rbV(+_w3s_jRcrwXG%Pi&EoO zXEbM-9Mrf(gWC2maBn1B*wrJ!=`z`GNDj)61HXn4fZvLCsL$9)uEL({sl@RN%KwPU zWxr|%YjUTW48L?%OYMsLSfLxa;Kg_x3n(m2r5E86?@Zug8IUD{kw2LdU{lp6AENpf zA=_OzDzf2p5po%_1#~JBeX^Q-ybdn;mkBOelR@~KknKm~@%_{%?n>$t6A9?>;HhLH zILY+L@pznQ3XNGg8(>K@PHo7C0C(Z2$V&Z_S`IWx_qE8c0f%T%nu<>)$_Qr+xK9wG z+~=e|?AM5^>Cx44|J#6S_7m~=-o*MipNgmKhmWGp=MwA4aid)g8>B1w;U(Zk5^)_5 zq}D}@O-wv;duK+NNP*^izBG9G9zVW`Uus9%}Az0$cKUd z#YB8>I>$(dhnQlG&&!7RvTz*t|Wb7YDuivYvgBeVGfDUPhnNb2?x zwBk{;b34G~NA9&2H432SPp(z9|9~BSxz><#uBb&I2|tnZn~dC%s7@IHzVJJ97NuS{1xP{As<0L zjr=C^2gvgf?2C}AkvAakK)xUOVdR6z!^o$QDg7Icmyka|PTwO4*C5YB&POgpE=9H@ z*CV$eZ$R!q4j@z7iQ^FR6UfJrPb1HT{*-VkfMLswhS8{9688dmzlHT}V$zc-A9Hy>8@gctQNSG#Z` z0qWTl^n2R@6jD=Azrh;{JA=W#pdjSZ^{T%1{%(K0x3|69@4!?11S8_ovY{aSAwk^R zv4Yv-!OEf|RM*w*r!(P;RO0FKZLaCVsw18eNOAQ-FK;(i=#o|WbZUd&yF~{U7N$1z zdD|ro!T--v*)n9aKZq5`9&fMD&xrejLZ{K~54ZMiVv@EyxB2`5T1SL5u$&M!y1V`U zfN;Oj;}7<9^&*hUCK94XPj?8SuJ(5K`-O*%QxXxLHcD%us7vdbg76I)!o;FkD;8!E zvU~m8y28Sr3Zl0s)G4wH;j;!T?skPCPLJTld0(3#e8(W-iTTY!AVrkwtV|XAdl_uL z(c9J+3=6j#;R@`z`c=jbv^VCN#*VFU5uEKc_DE&V8$;n>w;vBT4%1n$uO}e<*tn%5 z5bWv=cL>5yjNkkXt__-er;_|t}R;zE5Hzkd~ zxhJ&67YuVsm7p_OhHjy7yYKef7njN`!S$2$-`)Z_{5Mw8gMOnCD1VZE|1GfJ-Zme3 z5q_7-8~UWpfBzdiLBkwD*k%xf8!fk3?y|I7x-5GwLzb5<|6zI8VzTC1Z?`sCKWE)z z{kruz>v8KT>o2UvqKu-ei^_^t6x~r2D%w%>PeluD_u4*ZyU(`I_Mq)y+gEIVV|&{6 zylvF>vh63fH*Fu-t}nT%WMN5hNo7exiMwQD$&QlUC4(ggOI|Gbe#yHfDW&P9*ObmH zT~K;w>4wrTmOfc}qIC6A-_rY+?pylhrDdva(s!-Kest#6tt?HSo=c-<+8ml@}_2a6Es<*1%t;$%wXnE1{ zvgON{uUWox`TfiPe)+lOZ!Uj(`Tt!$YenXYvK8(X>sE*>_N@5h6@REQ|xxuo)vcytjaarbAZ?-P6mRKvTe_{Pw>+{wl);FwgTMb2~qU(wl z7A-BRDyl7dpyR9lq7x#@5^<9p|$0f5Km0E`dKe{GM3gN$4T9KSlxE zsiFOUhFn;)SlQTWcDT(& zg+(^Ou(!MwOr{@(;VId?Gr z5Oy)=V_w|R+qXCr_WCw24)EJ)EIJqx?SS)1O~DBi75e^5^xsO2WSB*_u|kS*c7JcE ztFsr6JmEGP*J0>hTH8Fr@%_lV!4|eaCZ+% zZXs1Ik?YnqI94(?ZjYm(K`^QqtD07?719!}ovWH!)`_cJ?o|#?O})q~%u*5RS|L-- zs%FvASSwbyI2wUeTqMk%9;4JIn5M^YH<6HT;i@DwM?-4@DTsKeg{xIC(QiPLqg1#?1=lvUR?FaP zRj`cR)GW+Zp)xX{xhk~TQ7gLZn_4_#U29{F$JNv*T&FEzwcuvP`wJ(OKuJflmw9tEde%&5|3%}L%^uOQvQ_v4735gmVuY-YIg|6BemuE8!97mMk!d6wTb|EDge96@!4Sjj~l5n&1{_PS+~E4UinjS8kki|JX{>}+tl-Dn2Ta|>2&G09>PtJjImYnxhx zBDIj*u?0dS;8H8PDYn1}Lh&>xbuCS+7?N#LBp7xz7HrWi-9m|q!K1py-4Mz+G8&;& z#UxMR4Iw6CES(fXAyB3kJ65kPDk+_+Daxlo)V4;22Gd$prdWTOS|Y`$H7-v*^-ZBt zEpjxhajbKTbr@JM3^{-R#}lelgw{rc;|A(F4bDbkxmw_^chz~U!U`3#-bo#6tp_8k z$ayu^3d4ybFj}PvpCE1b9O964$i2JWgRGp_Fy)RaSAe z%OS#ZMiYt}n>;Xav%}TmKtvZ_Oem7aYMKr3QTJ$KsU+!Ltm6vDCMl|S@$vt7LYbr( z*-p_v8GpQ#omeYo3Es1d%KP{c!}K zRQ^3(d7YyH+%WrLv9x-XOL#c}N19(?jHz|8K?^NK(Pu0Hhg*cXitzmeID#r`+q)#Q zoJuHj)ZWpGmgTM_{2-yE0WB_^#!qr=Qb$wkgh}0)A(bZO6!{!2nD7qy@0452rsVJo6T=gXsrlrzb%qXi(EW27NJ0!j6L^orevkZdddj-d)I99<2!Gk zq~DnZLg1VtG~uto@Ltv&{58-z0J-l+x$jL_0uTgc4S=mAq@~bWLh4@`47c2}?oLZ* z)w*?-CChKQCB*B|f4XXx;3lPFbkX8_AsiJTbX{X+>WA&r6t$VRA+!qX? zj4y^ju>Tn;2Wry$e`u7QCOiVU54JH&s>^GEc;sw1J#x4!wIjZyVUQvGHDhs^*OI@BNkzma)gYp*m@bthe-o1c#Ah;jEy_1$X7sK9dc$2c1 zTl__o%e7Mlv9FDpkZ7qk{2{Jr&}6#fC6$uSm8jLmmkbM-r3>$Gp(yK}Seknn?os%3;LZ!BNZko0zyw`{4#1iczTfPlY zZh8I$t1l2BL?zJ|IO*3A)y@k53CI@1d2$j(G3@IQEnk*!xQ8zR=93!8MnGOuAhL&Z z%4GR{AdFd2Li#wCS7bKmMU<`D4%*zRSqWVDX(1c=@H8bt08yB(7rYMyPG{;~PzxOL zhE&5N_)BMMl6Ak#tU_>{mln*zd=ZEWq~tZw(Lii@$&k|HATQxa-_zAow&*C+ zx2m+1&B>6`xsZ_K*gO2*aG}Kl6pWNiLW!3E$^=zpUb;xf>s&Hr+x%om>1joasd<@n zyyok8jU`jIWhO&PcYXw3IXYhXI$mdzDcj~ILrS0c2)y!iyv#aYr;{n$=p)aX7Azf_ zj+ZpX(K{wQ0(isx(MIhkw;fc8`&3a>#3P#Y4COf)N09xQ*McV)egq!cKK60?vKh7E zc%XwnlO&3Ml?a?4)(5HYz#yPQV{%fYm8?M{F}DUDJ;je+c&-VVTV4No6LSF9D}n!b!oi zvEsIN(aS!8P4Z*RWsn{0O&|`TTK|ArV@fT(eSQEO6elFvK173BU{V`OU)eUJoZBY{ zXWB$x#Li#aP)l*1$ur3;MZ&3}v3E)w=?mdu;BfyT4aEME)VJH1XR+H?j{{#^CRUbWL?ce5Cy;b&~bIhZNj#^(n`#An% zL8Yns7q@fGdXjfa8!{iOVfL9G$F-h3^h0nQR6Z3BikO|>pT^Fz4UYhq+mJmGAY$eg zz_&LPL(&(-xed)&6C}#|^b+8gbUjzKJYH-{N>^riz1I<0@~BEU2=8%I&zhc6Jj#w5 zxJXE{HC_dbTZ4a_1P@W*8GOYU0!4i?JB?qHc@&Yn2%L>F4gv6v1%I=Z`45BS08)uF z6*3Qy{pdJsWMnucfY=lq*`GOg@@G5Dq5aJM$FZtH*+BPZ+9c0uw*kzp`i>Ssx+2T( z{0Nr+B{boE`5}p-N=~-?1%SBavFz02m2cJ*L?>w2A?lPfhd^OTd2vxW^$DO#5o0Y* z19B}IcZjkutU!qTW}=KEZwuMZoEO>oQIw@4t4VKX(vDn1P4c*G2Z+awslE5Pk6^=n zz~MIB1d7xuYLabefC!QeLn6lR0G?J+eHTxmLeq1y?pkpbVne{8_=5v<*UC&VN{{1& z#*682UP9pz)~!{4{#QUYqL%9OZvkS5Dk>xmR{=;y`eDv5-34%&NuH%B!+Lo_lG_4m zN%ABVN~dyLY{WHh3kxyOB-!T`?grVDG-y1oqBfIonw5%6K;Z2a1_82^n&kG%P}&QF zXAiv;;!}`h-OZTlQd3P9ZS=Zp+lz?Fy6=ZPTz7?q=7dF2RG&&OS>~G(We#r&wkOC; z1aANVF0*-3nF)uY_2aTU1Q71Tl_DX7tS1Q5-7Hye8z2WYwZ4EW3%;ta`q)1JGNwTE zHe88@xRueD|Hw8}eO@k6k9r%L)xv}`77wSfA)(UTrX4ucQmKYB_)BMMlI^@uu``t& zfnI8o^$I}f5A%(WqSr8}bKlVVsmzh|dTtuMWSJWjnFD_Ml30>!2(N$-mw9U6cndf~ zOfR|J)4=(V29gWNB@N_uK!&bP^aK|mv}=ay8*PB(;KKkaWD6j>G?2Z39MV9(O0}+) zYw0b&4D#M08;Tu2jz^6ume-I_F39rlLjs_|Tc)1dRHFHS2AoT1gQU?)ilT>@7DP*4 z5o$&)x}#DcB?YLhf!Nwnu7Q-&{DwoOUQ0Qw=9vB7Vge3dM zu&le`wuDlCI+MQfrX&xoYo;2^_^a=|zm{+i5`j~u!;yO~je6XM>aTV{W=YoTqN0~v zq8?{bFKRDpCEi~Dj)SCx%1)s6qE_PV6-p>kPsu)JTyp!+-Lba42$R~BT9UWvR|up_ z)CZ}5P1Ofw8~%}EL;Sci$qY6fG%hh4BC_d4QD!?FhuVu~AlfvOb|$@cPNNrbrqOB< zIv}+`s$miSY6X{d|Ib9-@g{n3yEgV;2R_tbEcR+ipnz5n_+D)s=eMK#b00zXwbSV? z$(+OVBLC2}jxzgF;=B@j1>G9#bFhmh`q?hSG8#x}3mQU#NZj+Ti2E7nuAyA=kdFJ9 zjyuh1wcO2D#GQUY&~krD$NiFyyIrSy!4+|TO~?Ha9rx2Z?jPuMw_FkTaUJ)AI_~Fm z+~?_ZzcTLUb=>#sxWA_3evOWM*%j%2TE~4z$Ni*^`@iWdZ@(h$7j@hp*Kt3uFVu10ctzZQspEb~$Ni#?d#R55rYquZ)LDL5$NhaB_YFGkfh*!p zzo=^bxnxwwohB3-oYD@JyEMb6_0y?l_?vq1{cLEU#*L2fCOk%p`$3hmG*)htwLnR7 z(v97d;YhzFDWmyhIQ-Z4q5?2rda=6+nmejVzTZ)0mLMewGE2H&J&o@2tm(I?m(3(w zHEC^-w3D?s`QbQA=@)QrAMJA)jEAKLD! z%(BH2WR`SaJdN(Zi*`S*=!Nc?lw>WwAX|QF-&i^-$3p|%yJ?erH!-2;j^|zFC%Evf zA^D!705tZX(Mb~Cvz7uvcX+5ML23cn#rnG$cP?5!boJY`A@QR-DMe-j{r003O7~RN zBsL^E>lD49se!&%sEsXz(+Ql%l~_ks(()plL&!8MpxTqIEXnpETuLAB?&b+l=Dkw( zjj-$+a+I)<1R9*u9S}x>$oGSc_s8YFPshDk$NdXB?q7rR%mnxSI_{fv+z;xw7tN6F zv^$r^swEyB_aPnkBQvCXSjW9m$9kL$Qs&ydeQuHzoiaeqR`eZvfKKdj@vOUL~= z9e4T#b0$WaZ949D9rv9&?)S`4yC2eV-=^dKl#cuTGo*V!$GuF)J*?wSPn6As<)6}V z->Kt%SjYY08Pfex9rtz}_x(EV^Ja*9w~l+loeRJ7wdw9|O3gE5`A2lzH|lhMRHyp~ zDtGDmO!8G2gk{<$6Tk1^Zj?i$`Dzi0WpCkneU#rui)dc2odb;NB+S%7x^=ZI$v8{b zChKm?PsS-3PlhbD$#>bLjzFU{C3?mlMnQUvbjNnmD&&X`=SLERYVcaLl1fRf^&TLH zq&p7&#BZ1AWzQ#?fCmWwgss4TFEC4V(jlEZN8*%k1%#4Hc?BQ`CA~OKBOvnJhC|wQ zwIYDXb3cyrB|sKw=sW|6{B{G!IVRDe=T|x86+p(|7^EieG)>#I~aSi2qK;)5{*YW`(_ihfk50KqpM3QpI zgMi5QaUAm3fKXC(KdghC2P7XjBs#D44j^YVdgbC_5fw)auqUb6Z|}So`?59Otf!>% zS|B}QBDK5pVQT)%2<*(TvCSZRUKVa7LGIMlBBZ++Br*QnOAw6>cWG*oANmkmD5-i4 z0jE-<*H;0#sDb<=;b>yr%MxWW9GCelAg49$^)?{$rE(tGy1`xTO}t;UGaOYOdgx%k z5)Vn%EI>{wl=0O9d=6=qCsUzJI5z@kT)`p8LO{-IwAcg)aVL4X%ntxUoK@}*1F{GZ z)mQ%tkPR9-hXFaQfxHR`{VJ_KA9XE>hon+o0Ej%saqg9X$ZL8WvKA1n?wx?tYIyAd z!~)8ygbx8ypu`PP`uO=q1wwNCC2-_d!7f+BGXyfxiK;-ps@-g-yc!B@I zYnEF1Tfk8x67K~&7#+2BP6CH~mHV?OV#!qMxg-I%#w);S)<}2>kTQ*(e+|ff1qaVe zchiUHb2K>Vcw|N$@riyOJw$_~+HjE$QVYl<3T47>)!}Rgl=K)cp z7SVZ`;Uq?q*8o9hN~rZSK!!EkF9UK&fr$Lm`@&j{ruf(fOJqN8!gGt zTN^%oDwlM3_4?&=w%4*C27-Rk$9CmFtfg_-h0m$ktwr>H2tG=R*+m#1DBa|5CqQj? z_bR+I0yH9SLHClCxf{YjLb{;!}kyU5yCLfZb7} ze7Xo%c=IJ`V`#!5X!5qtfMYL?hB6TwiqNZXf~f2ig%X=pgmYp?Wv(ULe1+|=EMlJ& z(1PRkvwfaLOBd}*v$CP78XwBTD9d^J^-A^u z5Pw6T)!=*8u*L_Me#o$$!9`zR-{vlICU4lA4{OPV)5B4XzK+#{ry_}^q;6+O+KgKe zSGvWTKA2})xCPb?jK}o7B_m`v^L4Qx*7Qeod=xK1%9Ig#t`V|u2rNf7SL-b;RC}QUw zT3PYCXy@^2Y(%39tt$e09X@c|?3BD9`MP?0BRvKpt1Hs(M0^{iy1t;iYtba7e3POi z;?8Y;k`FYRor-V(xI&G6y|PcbdZkU57>3H(-`n3KcJ(ly#*&l@#Bk z$R!0M*3oc|{h@-}nKMXTkH;7KH3ox^%{*j8p(h_VVAjL4H zU-1Uy-AfR)+acMlrKEjJYa_m#iEpyHovpP^_!?jXK94JXl}(&t`zDMr=!57@6s-^g zAaugkR;*O>1vf;yo&X$&Z%r?4$He$gwR;nz!79l+ElD)cxXPwicJz~Jwvke4NQ{{_ z+~S-x4ATj(_6PYGg|5=k2hDnWU>9Y}B%D+1R5V37Vlw)U)Bt?eFNx<-_oh_g; zZlpyhlkOqL>cX&r5Q~fwcZkO1=CfV2KsT12@ZoE(4=O;9E?nc|614?Eyz3K$9^`U8-h2CkG>(MW-eBSuyh@DyxVSsw1vgsdO0WQfbR|HzJ=N{A zU^EGb-^);^)U+GdWE%g{wHY7OXuRqUhuZNCauJ(~`6za9=Cnf>nr-qOvWUNCb2PPe zq&YU~PVNqydivTCcH1zVE4*~$y6if5&@90!({wJmugguc$?pv$HkIV|u%65m8fdqR zBlqWWi5S|q7Kv8o5!fz`MbwUdi`I>qnLq{oPu>vDjvdf+kixBg@8&|(O`g0kB@0EZ zL3ld{613*cp>GJb9hvMH0qG`}jdO54>}i(ha}o`C+cFYT*_)2^Mw?^sVcVc_m*<0q zh@q*omxgSDCT>Qjws&%*aydMTEYk)r+{lQ*;H_p9~TAC~*emYd@|4>5PJzVYNC_HL-0|AkJ z%pb@IAZ$}Vsh%fkhe7HRq9*hrn#z{aZOTWsn~bd#lM;3p#1~WXIXSI^N?6hkf+D`* zz)isw=ljiJ(NdChvOO17x0V)rR3dcykq{R^g$Mbho~GDYW~W%0I)>UzrZ> zb-7QoB{A*yT*b*ujwz9D%S=_dgjQ1xF7JiO;sJ*1E9*O&0Gv1^a!(B>m_SUNRH|bo zjh{?eX~v$ zGssG$(PikxHI+1rRZ?`BhL~zh8WgYvsoG_vfi~3NCy%q!O=ILSL$6Zuc)={iepQro z{jeF_!zYftoqR^cgr07$ie8i$zmz_t?a^u|gZP-b zZ4QMui#^opi2;ZAG6b$EXJougFEh6D=bt`+Nk6pxKikC20{{R3 literal 0 HcmV?d00001 diff --git a/shaders/pixel.vert.glsl b/shaders/pixel.vert.glsl index 1e8ac51..79b97b0 100644 --- a/shaders/pixel.vert.glsl +++ b/shaders/pixel.vert.glsl @@ -10,5 +10,5 @@ out vec3 color; void main(void) { color = inColor; - gl_Position = vec4(inTexPosition.x*texRatio.x, inTexPosition.y*texRatio.y, 0.0, 1.0); + gl_Position = vec4(inTexPosition.x*texRatio.x -1, inTexPosition.y*texRatio.y -1, 0.0, 1.0); } diff --git a/shaders/world.frag.glsl b/shaders/world.frag.glsl index 073a536..10131f5 100644 --- a/shaders/world.frag.glsl +++ b/shaders/world.frag.glsl @@ -1,6 +1,6 @@ #version 330 core -uniform sampler2D colorMap; +uniform sampler2DRect colorMap; uniform vec3 camera; uniform vec2 worldSize; @@ -14,8 +14,5 @@ void main() vec2 screenPos = gl_FragCoord.xy/gl_FragCoord.w + camera.xy; vec2 texCoord = (screenPos-halfScreen)/200; vec3 texColor = texture(colorMap, texCoord).xyz; - if(length(screenPos-halfScreen)*camera.z < 200) - outColor = vec4(texColor, 1.0); - else - outColor = vec4(0.0, 0.5, 0.5, 1.0); + outColor = vec4(texColor, 1.0); } diff --git a/src/drawwidget.cpp b/src/drawwidget.cpp index 38eac2f..c508127 100644 --- a/src/drawwidget.cpp +++ b/src/drawwidget.cpp @@ -1,13 +1,12 @@ #include "drawwidget.h" #include #include -#include #include #include #include #include #include -#include "map.h" +#include "mapscene.h" #include "pixelpipeline.h" #include @@ -17,20 +16,20 @@ DrawWidget::DrawWidget(QWidget *parent) : { connect(&openglRefreshTimer, SIGNAL(timeout()), this, SLOT(repaint())); openglRefreshTimer.start(16); - m_map = new Map(200, 100); +} + +DrawWidget::~DrawWidget() +{ + delete m_pipeline; + delete m_map; + if(m_Qt_fbo != NULL && m_Qt_fbo != FrameBuffer::screen) + delete(m_Qt_fbo); } void DrawWidget::initializeGL() { renderer.initGL(width(), height()); - - m_pipeline = new PixelPipeline(200, 100); - m_map->setPipeline(m_pipeline); - - m_pipeline->pushChange(glm::vec2(50, 50), glm::vec3(0, 1, 0)); - m_pipeline->pushChange(glm::vec2(150, 50), glm::vec3(0, 0, 1)); - m_pipeline->updateChanges(); - + m_map = NULL; renderer.setScene(m_map); } @@ -41,13 +40,34 @@ void DrawWidget::paintGL() void DrawWidget::resizeGL(int w, int h) { + m_width = w; + m_height = h; renderer.resizeGL(w, h); if(m_Qt_fbo != NULL && m_Qt_fbo != FrameBuffer::screen) delete(m_Qt_fbo); m_Qt_fbo = new FrameBuffer(defaultFramebufferObject()); - m_pipeline->setTargetFBO(m_Qt_fbo); + if(m_map != NULL) + m_pipeline->setTargetFBO(m_Qt_fbo); } +void DrawWidget::startSimulation(GenerateFunction genFunc, std::vector behaveFuncs) +{ + if(m_map != NULL) + { + delete m_map; + delete m_pipeline; + m_map = NULL; + } + m_map = new MapScene(behaveFuncs.size(), 200, 100); + genFunc((Map*)m_map); + m_pipeline = new PixelPipeline(m_map); + m_pipeline->setTargetFBO(m_Qt_fbo); + m_pipeline->resizeGL(m_width, m_height); + renderer.setScene(m_map); +} + +// INPUT EVENTS + void DrawWidget::mouseMoveEvent(QMouseEvent *event) { if(grabbedMouse) diff --git a/src/drawwidget.h b/src/drawwidget.h index 7c750f1..484771b 100644 --- a/src/drawwidget.h +++ b/src/drawwidget.h @@ -5,8 +5,11 @@ #include #include +#include "map.h" +#include "team.h" + class PixelPipeline; -class Map; +class MapScene; class FrameBuffer; class DrawWidget : public QOpenGLWidget @@ -20,9 +23,11 @@ class DrawWidget : public QOpenGLWidget // camera handling variables QPoint lastMousePos; bool grabbedMouse; - Map *m_map; + MapScene *m_map; FrameBuffer *m_Qt_fbo; PixelPipeline *m_pipeline; + int m_width; + int m_height; protected: // Output @@ -39,6 +44,10 @@ class DrawWidget : public QOpenGLWidget public: DrawWidget(QWidget *parent = 0); + ~DrawWidget(); + + public slots: + void startSimulation(GenerateFunction, std::vector); }; #endif // DRAWWIDGET_H diff --git a/src/dude.cpp b/src/dude.cpp new file mode 100644 index 0000000..4db8303 --- /dev/null +++ b/src/dude.cpp @@ -0,0 +1,6 @@ +#include "dude.h" + +Dude::Dude() +{ + +} diff --git a/src/dude.h b/src/dude.h new file mode 100644 index 0000000..0578438 --- /dev/null +++ b/src/dude.h @@ -0,0 +1,20 @@ +#ifndef DUDE_H +#define DUDE_H + +#include "team.h" + +class Dude +{ +private: + Coord pos; + Info info; + bool dead; + char memory[DUDE_MEMORY_SIZE]; + BehaviorFunction behavior; + +public: + + Dude(); +}; + +#endif // DUDE_H diff --git a/src/libwidget.cpp b/src/libwidget.cpp index eae7f26..be6594f 100644 --- a/src/libwidget.cpp +++ b/src/libwidget.cpp @@ -10,15 +10,16 @@ #define LIB_SUFFIX "so" #endif -typedef void (*ThinkFunction)(void); - LibWidget::LibWidget(QWidget *parent) : QWidget(parent), ui(new Ui::LibWidget) { ui->setupUi(this); - refreshLibs(); - connect(ui->pushButton, SIGNAL(pressed()), this, SLOT(refreshLibs())); + refreshBehaviors(); + refreshGenerators(); + connect(ui->behaviorsRefreshButton, SIGNAL(pressed()), this, SLOT(refreshBehaviors())); + connect(ui->generatorsRefreshButton, SIGNAL(pressed()), this, SLOT(refreshGenerators())); + connect(ui->launchButton, SIGNAL(pressed()), this, SLOT(launchSimulation())); } LibWidget::~LibWidget() @@ -26,10 +27,10 @@ LibWidget::~LibWidget() delete ui; } -void LibWidget::refreshLibs() +void LibWidget::refreshBehaviors() { - while(ui->listWidget->count() > 0) - ui->listWidget->takeItem(0); + while(ui->behaviorsList->count() > 0) + ui->behaviorsList->takeItem(0); QDir teamDir(QCoreApplication::applicationDirPath()); if(teamDir.cd("../teams")) { @@ -40,10 +41,11 @@ void LibWidget::refreshLibs() QLibrary lib(info.absoluteFilePath()); if(lib.load()) { - ThinkFunction func = lib.resolve("think"); + BehaviorFunction func = (BehaviorFunction)lib.resolve("think"); if(func) { - ui->listWidget->addItem(info.baseName()); + ui->behaviorsList->addItem(info.baseName()); + m_behaviorList.push_back(func); } } } @@ -52,3 +54,40 @@ void LibWidget::refreshLibs() else emit sendError(QString("ERROR : can't open the teams folder.\n"), 5000); } + +void LibWidget::refreshGenerators() +{ + while(ui->generatorsList->count() > 0) + ui->generatorsList->takeItem(0); + QDir genDir(QCoreApplication::applicationDirPath()); + if(genDir.cd("../generators")) + { + for(const QFileInfo &info : genDir.entryInfoList()) + { + if(info.suffix().compare(LIB_SUFFIX) == 0) + { + QLibrary lib(info.absoluteFilePath()); + if(lib.load()) + { + GenerateFunction func = (GenerateFunction)lib.resolve("generate"); + if(func) + { + ui->generatorsList->addItem(info.baseName()); + m_genList.push_back(func); + } + } + } + } + } + else + emit sendError(QString("ERROR : can't open the generators folder.\n"), 5000); +} + +void LibWidget::launchSimulation() +{ + GenerateFunction genFunc = m_genList[ui->generatorsList->currentRow()]; + std::vector behaveFuncs; + for(QListWidgetItem *item : ui->generatorsList->selectedItems()) + behaveFuncs.push_back(m_behaviorList[ui->behaviorsList->row(item)]); + emit createSimulation(genFunc, behaveFuncs); +} diff --git a/src/libwidget.h b/src/libwidget.h index 61f691c..57885d8 100644 --- a/src/libwidget.h +++ b/src/libwidget.h @@ -4,9 +4,12 @@ #include namespace Ui { -class LibWidget; + class LibWidget; } +#include "team.h" +#include "map.h" + class LibWidget : public QWidget { Q_OBJECT @@ -16,13 +19,18 @@ public: ~LibWidget(); private slots: - void refreshLibs(); + void refreshBehaviors(); + void refreshGenerators(); + void launchSimulation(); private: Ui::LibWidget *ui; + std::vector m_genList; + std::vector m_behaviorList; signals: - sendError(QString, int); + void sendError(QString, int); + void createSimulation(GenerateFunction, std::vector); }; #endif // LIBWIDGET_H diff --git a/src/libwidget.ui b/src/libwidget.ui index 6aa1c0b..646dc25 100644 --- a/src/libwidget.ui +++ b/src/libwidget.ui @@ -13,10 +13,7 @@ Form - - - 5 - + 5 @@ -29,7 +26,42 @@ 5 - + + + + QAbstractItemView::SelectRows + + + + + + + Refresh + + + + + + + Refresh + + + + + + + Terrain generators + + + + + + + Pixel behaviors + + + + @@ -47,18 +79,25 @@ 0 - - - - Refresh - - - - - + + + + QAbstractItemView::MultiSelection + + + QAbstractItemView::SelectRows + + + + + + + Launch + + diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 576fbd1..1f17cdc 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -9,6 +9,8 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); connect(ui->libWidget, SIGNAL(sendError(QString, int)), ui->statusBar, SLOT(showMessage(QString, int))); + connect(ui->libWidget, SIGNAL(createSimulation(GenerateFunction,std::vector)), + ui->drawWidget, SLOT (startSimulation( GenerateFunction,std::vector))); } MainWindow::~MainWindow() diff --git a/src/map.cpp b/src/map.cpp index 4ab6345..836f3b2 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1,10 +1,21 @@ #include "map.h" +#include -Map::Map(int width, int height) : +Map::Map(int nbTeams, int width, int height) : m_width(width), - m_height(height) + m_height(height), + m_nbTeams(nbTeams) { - if(!height) - height = width/2; - // TODO allocating map + if(m_height == 0) + m_height = m_width/2; + map = new Pixel*[m_width]; + Pixel *ptr = new Pixel[m_width*m_height]; + for(int i=0; i - struct Pixel { - enum Type { - BEDROCK, GRASS, TREE, BERRIES, ROCK, IRON_ORE, // nature - FOOD, WOOD, STONE, IRON, SWORD, // resources - DUDE, DEAD_DUDE, // humans - SPAWN, WALL, ROAD, MARK, LIBRARY // buildings - }; - - union PixelData { - int nbRes; - void* knowledge; - }; - - int type; - PixelData data; + enum Type { + BEDROCK, GRASS, TREE, BERRIES, ROCK, IRON_ORE, // nature + FOOD, WOOD, STONE, IRON, SWORD, // resources + DUDE, DEAD_DUDE, // humans + SPAWN, WALL, ROAD, MARK, LIBRARY // buildings + }; + + union PixelData { + int nbRes; + void* knowledge; + }; + + int type; + PixelData data; + + Pixel() : type(GRASS) {} }; -class Map : public BasicScene +class Map { - MapData map; + Pixel **map; int m_width; int m_height; + int m_nbTeams; public: - Map(int width, int height = 0); - - int getWidth() { return m_width; } - int getHeight() { return m_height; } + Map(int nbTeams, int width, int height = 0); + ~Map(); + + int getWidth() const { return m_width; } + int getHeight() const { return m_height; } + int getNbTeams() const { return m_nbTeams; } + + /** + * @brief operator [] allows to access a pixel of the map with the following syntax : + * Pixel &p = map[x][y]; + */ + Pixel* operator[](int i) + { return map[i]; } }; +typedef void (*GenerateFunction)(Map *map); + #endif // MAP_H diff --git a/src/mapscene.h b/src/mapscene.h new file mode 100644 index 0000000..1a4ff60 --- /dev/null +++ b/src/mapscene.h @@ -0,0 +1,12 @@ +#ifndef MAPSCENE_H +#define MAPSCENE_H + +#include "map.h" +#include + +struct MapScene : public Map, public BasicScene +{ + MapScene(int n, int w, int h = 0) : Map(n, w, h) {} +}; + +#endif // MAPSCENE_H diff --git a/src/pixelpipeline.cpp b/src/pixelpipeline.cpp index a40d570..ff04b0c 100644 --- a/src/pixelpipeline.cpp +++ b/src/pixelpipeline.cpp @@ -1,56 +1,84 @@ #include "pixelpipeline.h" #include #include -#include #include #include #include #include +#include "mapscene.h" #define SCROLL_SPEED 0.998f +#define HEX_TO_VEC3(hex) glm::vec3(float((hex & 0xFF0000) >> 16)/255, float((hex & 0x00FF00) >> 8)/255, float(hex & 0x0000FF)/255) + +inline glm::vec3 getColor(const Pixel &p) +{ + switch(p.type){ + case Pixel::BEDROCK : return HEX_TO_VEC3(0x101020); + case Pixel::GRASS : return HEX_TO_VEC3(0x719678); + case Pixel::MARK : return HEX_TO_VEC3(0x5D7B62); + case Pixel::ROCK : return HEX_TO_VEC3(0x8C8C8C); + case Pixel::IRON_ORE : return HEX_TO_VEC3(0x917B61); + case Pixel::TREE : return HEX_TO_VEC3(0x003800); + case Pixel::BERRIES : return HEX_TO_VEC3(0x4D6394); + case Pixel::FOOD : return HEX_TO_VEC3(0xFF7A7A); + case Pixel::WOOD : return HEX_TO_VEC3(0x634A22); + case Pixel::STONE : return HEX_TO_VEC3(0x454545); + case Pixel::IRON : return HEX_TO_VEC3(0x4A4036); + case Pixel::DUDE : + // TODO + return HEX_TO_VEC3(0x0000FF); + case Pixel::SPAWN : + // TODO + return HEX_TO_VEC3(0x0000FF); + case Pixel::WALL : return HEX_TO_VEC3(0xE6B2A1); + case Pixel::ROAD : return HEX_TO_VEC3(0xEDB287); + case Pixel::SWORD : return HEX_TO_VEC3(0xEBEBEB); + case Pixel::LIBRARY : return HEX_TO_VEC3(0xA37A50); + case Pixel::DEAD_DUDE : return HEX_TO_VEC3(0xFF0000); + default : return HEX_TO_VEC3(0x0000FF); // bleu absolu = bug + } +} + + // MESH (2D points) class PixelMesh { private: GLuint m_vao; - - void updateBuffer() - { - TBuffer::BufferEditor editor(pixBuffer); - std::memcpy(editor.getPointer(), m_pixels.data(), m_pixels.size()*sizeof(Pix)); - m_pixels.clear(); - } + GLuint m_vbo; public: - struct Pix - { - glm::vec2 pos; - glm::vec3 color; - }; + struct Pix + { + glm::vec2 pos; + glm::vec3 color; + }; + + std::vector m_pixels; - std::vector m_pixels; - TBuffer *pixBuffer; - - PixelMesh() - { - m_pixels.push_back({glm::vec2(0), glm::vec3(0)}); // buffer must not be empty - glGenVertexArrays(1, &m_vao); - glBindVertexArray(m_vao); - - pixBuffer = new TBuffer(m_pixels, Buffer::VBO, true); - pixBuffer->setVertexAttrib(0, 2); - pixBuffer->setVertexAttrib(1, 3, sizeof(glm::vec2)); - - glBindVertexArray(0); - } + PixelMesh(int size) + { + glGenVertexArrays(1, &m_vao); + glBindVertexArray(m_vao); + + glGenBuffers(1, &m_vbo); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Pix), (void*)(0)); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Pix), (void*)(sizeof(glm::vec2))); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glBindVertexArray(0); + } ~PixelMesh() { if(m_vao != 0) { - delete(pixBuffer); + glDeleteBuffers(1, &m_vbo); glDeleteVertexArrays(1, &m_vao); m_vao = 0; } @@ -58,20 +86,29 @@ public: void draw() { - glBindVertexArray(m_vao); - updateBuffer(); - glDrawArrays(GL_POINTS, 0, m_pixels.size()); - glBindVertexArray(0); + glDisable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glBindVertexArray(m_vao); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); + glBufferData(GL_ARRAY_BUFFER, m_pixels.size() * sizeof(Pix), m_pixels.data(), GL_DYNAMIC_DRAW); + glDrawArrays(GL_POINTS, 0, m_pixels.size()); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + m_pixels.clear(); } }; // PIPELINE -PixelPipeline::PixelPipeline(int mapWidth, int mapHeight) : - m_mapWidth(mapWidth), - m_mapHeight(mapHeight), - m_camera(0, 0, 1) +PixelPipeline::PixelPipeline(MapScene *map) : + m_mapWidth(map->getWidth()), + m_mapHeight(map->getHeight()), + m_camera(0, 0, 1) { + m_width = 256; + m_height = 256; + map->setPipeline(this); m_targetFBO = FrameBuffer::screen; m_mapFBO = new FrameBuffer(); m_mapTex = new Texture(GL_RGBA, GL_RGBA, m_mapWidth, m_mapHeight, GL_UNSIGNED_BYTE, GL_TEXTURE_RECTANGLE); @@ -93,14 +130,27 @@ PixelPipeline::PixelPipeline(int mapWidth, int mapHeight) : glBufferData(GL_ARRAY_BUFFER, 3 * 2 * sizeof(GLfloat), vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*2, NULL); glEnableVertexAttribArray(0); - + std::string vertSource = QtUtils::fileToString(":shaders/shaders/pixel.vert.glsl").toStdString(); std::string fragSource = QtUtils::fileToString(":shaders/shaders/pixel.frag.glsl").toStdString(); m_texMapShader = new Shader(vertSource, fragSource); vertSource = QtUtils::fileToString(":shaders/shaders/world.vert.glsl").toStdString(); fragSource = QtUtils::fileToString(":shaders/shaders/world.frag.glsl").toStdString(); m_renderShader = new Shader(vertSource, fragSource); - m_changes = new PixelMesh(); + m_changes = new PixelMesh(map->getWidth() * map->getHeight()); + for(int i=0; igetWidth(); ++i) + for(int j=0; jgetHeight(); ++j) + pushChange(glm::vec2(i, j), getColor((*map)[i][j])); + updateChanges(); +} + +PixelPipeline::~PixelPipeline() +{ + delete m_mapFBO; + delete m_mapTex; + delete m_texMapShader; + delete m_renderShader; + delete m_changes; } void PixelPipeline::pushChange(const glm::vec2 &pos, const glm::vec3 &color) @@ -115,6 +165,7 @@ void PixelPipeline::updateChanges() m_mapFBO->bindFBO(); glViewport(0, 0, m_mapWidth, m_mapHeight); m_texMapShader->bind(); + m_texMapShader->bindVec2(m_texMapShader->getLocation("texRatio"), glm::vec2(2.0f/m_mapWidth, 2.0f/m_mapHeight)); m_changes->draw(); } } @@ -122,6 +173,8 @@ void PixelPipeline::updateChanges() void PixelPipeline::renderGL(Scene *scene) { m_targetFBO->bindFBO(); + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, m_width, m_height); glDisable(GL_BLEND); glDisable(GL_DEPTH_TEST); diff --git a/src/pixelpipeline.h b/src/pixelpipeline.h index 38e07e8..25720ee 100644 --- a/src/pixelpipeline.h +++ b/src/pixelpipeline.h @@ -7,6 +7,7 @@ class FrameBuffer; class Texture; class Shader; class PixelMesh; +class MapScene; class PixelPipeline : public Pipeline { @@ -26,7 +27,8 @@ private: unsigned int m_vao, m_vbo; public: - PixelPipeline(int mapWidth, int mapHeight); + PixelPipeline(MapScene *map); + ~PixelPipeline(); void pushChange(const glm::vec2 &pos, const glm::vec3 &color); void updateChanges(); diff --git a/src/team.cpp b/src/team.cpp new file mode 100644 index 0000000..9c318e5 --- /dev/null +++ b/src/team.cpp @@ -0,0 +1,3 @@ +#include "team.h" + +// TODO Info functions diff --git a/src/team.h b/src/team.h new file mode 100644 index 0000000..7b9a747 --- /dev/null +++ b/src/team.h @@ -0,0 +1,115 @@ +#ifndef BEHAVIOR_H +#define BEHAVIOR_H + +#include + +#define DUDE_MEMORY_SIZE 128 +#define LIBRARY_SIZE 128 +#define COM_SIZE 32 + +enum Dir { + NORTH, + EAST, + SOUTH, + WEST, + NO_DIR = -1 +}; + +struct Coord +{ + int x; + int y; + + Coord(const Coord &c) : + x(c.x), y(c.y) {} + Coord(int x, int y) : + x(x), y(y) {} + Coord(Dir d = NO_DIR) + { + switch(d) + { + case NORTH : x= 0; y=-1; break; + case SOUTH : x= 0; y= 1; break; + case WEST : x=-1; y= 0; break; + case EAST : x= 1; y= 0; break; + default : x= 0; y= 0; break; + } + } + Coord operator+(const Coord &c) const + { return Coord(x+c.x, y+c.y);} + Coord& operator+=(const Coord &c) + { x+=c.x; y+=c.y; return *this; } + Coord operator+(Dir d) const + { return *this + Coord(d); } + Coord& operator+=(Dir d) + { return *this += Coord(d); } + Coord operator-(const Coord &c) const + { return Coord(x-c.x, y-c.y); } + Coord& operator-=(const Coord &c) + { x-=c.x; y-=c.y; return *this; } + Coord operator*(const Coord &c) const + { return Coord(x*c.x, y*c.y); } + Coord& operator*=(const Coord &c) + { x*=c.x; y*=c.y; return *this; } + Coord operator/(const Coord &c) const + { return Coord(x/c.x, y/c.y); } + Coord& operator/=(const Coord &c) + { x/=c.x; y/=c.y; return *this; } + int dist() const // manhatthan distance + { return abs(x) + abs(y); } + int operator~() const + { return dist(); } + static dist(const Coord &c1, const Coord &c2) + { return ~(c1-c2); } + int dist(const Coord &c) const + { return dist(*this, c); } +}; + +struct Com +{ + enum Flags { + BOOK1 = 0, + BOOK2 = 1, + BOOK3 = 2, + BOOK4 = 3, + + READ = 0, + WRITE = 4 + }; + + int flag; + char data[COM_SIZE]; +}; + +struct Action +{ + enum Type { + MOVE, + ATTACK, + PICK, + PUT, + WORK, + WAIT, + COLOR, + COMMUNICATE + }; + + Type type; + Dir dir; + Com com_data; +}; + +class Info +{ + // TODO +public: + bool success; + int inventory; + const Com& getCom(); + int getNear(Dir d); + int getInfo(Dir d); +}; + +typedef void (*BehaviorFunction)(Action *action, char *memory, const Info *info); + +#endif // BEHAVIOR_H diff --git a/teams/hello.cpp b/teams/hello.cpp index 6ee1d48..133a7b6 100644 --- a/teams/hello.cpp +++ b/teams/hello.cpp @@ -1,5 +1,4 @@ #include -#include // g++ -shared hello.cpp -o hello.dll diff --git a/teams/hello.dll b/teams/hello.dll new file mode 100644 index 0000000000000000000000000000000000000000..d3f0b3ad26d9c0207291bbdb886abcb04509e910 GIT binary patch literal 43078 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 a_Rsg2w_w48t;frnU3ur9K7fhe*8UqELe2gF literal 0 HcmV?d00001 diff --git a/teams/plop.dll b/teams/plop.dll new file mode 100644 index 0000000000000000000000000000000000000000..d3f0b3ad26d9c0207291bbdb886abcb04509e910 GIT binary patch literal 43078 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 a_Rsg2w_w48t;frnU3ur9K7fhe*8UqELe2gF literal 0 HcmV?d00001 diff --git a/teams/truc.dll b/teams/truc.dll new file mode 100644 index 0000000000000000000000000000000000000000..d3f0b3ad26d9c0207291bbdb886abcb04509e910 GIT binary patch literal 43078 zcmeHw4_sW;mH!(Uk}(iK4Hh-7qa`iTgv`J|fIu<>3}KW2GLU~pUxr~wF#MU$4EeXQ zO`M>aW$B0AT6Md&o2=sFd(Yr0yS?xrp&sZDEZvud6Fo_p_m zZ{9pWP1*LhU2k%E@11+@`FGDf_r5#ty}N4tkd!J(k{LN3m!!iuQgX7t)Bo9x;>_#6 zmMJ}P*}vRy*i`>7H?(Z-3|oVt-c2E2x7F|K>FJGF+XB{5Uyrr3$6C|qwRZQm2MXrS zos%a>H@PLL-jv0!S|n*dggGP4x*^?^k}F*Wa5*xBv(CdY8`*{|IosHI3YXgi2+7Y< zHm-2-$=^y$FVy7qr~=hTVuzq4Rnf(6NvfGeCsU+DUgn-52rUaz24<$Rx`(bfG1uWE(CBal{tV#ffY|W|eRh z33$#W4t_B_8^03e&Eiru~T}(bJf%hX5UMX@yVtAoISFc~B0xvua6U83R5r7l$$AOjf{P${(kcUA4qvXP5WU z-!sTWuK_tBF}&hp2FWquZ~>X{nixp^!|+O$vTLp)kO{9@MPVnThaU3YSKjFP++*gv z-M}1|;EOSHUTkFi`|ytbmmhh-?`(VIIQ~TD9wR@HqNBO?;oC=WI85^1J~GrA`^lQs zATocTHKYGz-{u3-MrT|9aMq`10Uj}kQEBpD;u476q+tI0D{1H@YLECa2U*u1>>SoC~GG>x?6f@z}KhtJi-mqsck8S5Fc-MKjsV(30*f^$pgd@%Aci8RR`a<;)# z7CJCOgg!n8+|K>t-FRGSg>#n!aE1V=W9D@v9LCR}fLA1&oclIVVs8#U`*B=IgGuudv);bv$~}w5^Cp#Wv)biOik9jmJR-4cq@bXbf(Z>?bF_9(~)C z)&DlX9)IRC&RwbUayH|Pra97g55wF6Udi%(m18A?zdSkkrFY_S`$=*TXwzRP=qVg` zXq5yg<~}?A2hOAOn&Dgm(nKnVc<%+Ob{T~NaChj#xafzN+rFZUWK}Gdq zSn4c>U}o@he}+;RO0*yK?3TQ|V`(;cHi?0bhb~Z`mp@RGXC1!|$kEaH=#Ya?e2j|G zBQnPCLvTl}jER>hK2Uhb9=NUvT@$V(p%=x!7dwhBdHC>0(WBmsEL6Zbn}LIZM@Hep zB;A!jMmxrHT3CSv-S2YdeGmqf&NhM8*nwO)1WHN)S;(k^ME~&DNSw%3guax>m^Cu7 zBj{U~0i9~bPYwny-hSsDBdk9_ULFydoH-;kr*;Uka%#6uMU9Db@&E}BaWWXk3Qpj} z$PiD0K7?uq8Hn%-5XO5TD$b>=Am?-AL0p09i4lfud3ydvpkNG>1SB_lx5dO@93&ul3@danZaZDUfi{mMFMBC-7 zG3#*E#guiR*52K*|8=tkxoOJf%h9>ZGXa)hYJvZykCqTf7|KjduN^EUmB{Ab6|Kq^E@ z!DupK=D@z6C1R7l`P8DY2^rafYo?qTGEMwl$B=zk@igvlC^wH#pcnG7YvGG@AbAfw z4BLUIx)RKN#Z^6I^%= zMgQpeiUXzaW11RFfXzTo1+FkVxW!!di*0iTc3M&!EoI*c^+iWa(IXjUBYi)i0RA(m zg;0DfYwr(9HplG)*HOLaUQ02(5v#WFS;_cQh~cR#Gh)@|LH7$xGD0GaXa+n`V>3g< zc+Ng@5gH95;Q{xV=tXDW< zM1KHmB6+-r?`2f8F?;z+Jg1&433E8nk%2e3rEr8t_S=P65()5t+Q=$1^z@Y&d&PuUsIKf=~m3Jd7G$*Jp<_jXpFy*Bw##Ee`BqqSxt-EyI`z>JtNDb9BTq@Bq;o zyqEr_dN0OWUl{*1YM^a6UW}E5PBOoyHgD{dcjd>sl( zrV9hv7#3a~T=jzDIk9>)wKK_i_|$aJeH;y(!5h_l80QvvisBpOZNe`m2DzPz`rpjz zUj{!IxYgW$B5Usmn)uw!xXyYC_I0*pJvG)5bC1Tx5ZvPNj_BQ^QdZqq?83rt?fEH{ zo8BS?{}H2j)>G~mI%2a_YiHf_X`+=ww4R)m_2gLWyL(Q6MttvZR^4}F7jAAH<&}d} z`APQ+`({lXx%uwV*oD;PvAbUwUk7k(`NZP`bICnSzZh_tnK~}ZfK%tCV{ZcyUXAw2 zruG@e^#Kb)-2nP%4O2w~yFgo=Ay}3|5;4=JgXIZZj@S92H^yfD||`veTG%&!evq4nWDb4_E(Gg zPN7aw-`Jja8I#=Dh2MuKs4tHyRAo)P7qQ-6d(m%nC#^2 z=GXBYCr&8P6J;joTwQpGJpGRIN}+%!0F*$bx2vcEf;@^aT-y|+Oae;FHul=Ie5cNd`qB5uH;DMfPzp5-OqFJHwx^R z$4?*#PkdJR!}v3F^`Pocsm_W$rL^c5NyAj7W2j@#_S|$6CS{nBjiCPzz#}{Ml&)GY z$|t^~pU?5=8CMRLbI}-s+!mT=3q@qZsc0~$)SO|jItkWo1I!`Df@OP zBYMOX9nLTNWoR7B7IzZ;)-~Ln<`3+`#IXYR;aH8pK))@$V^1Z;S#VCr{Es{gca}rA z^+GJFg(D!y{O5rRTn!HKc)fcbF0!7wYu4a~l-&NG^<_>R!~Ef>DLRs0_ImhZG>Bke zrdwNb{P7epLW93b#9tNUfj>Im{^sqm3&f24*=v6}dfuYRGCMkIp@}Y+;~NO{kYfT? z%7*1hj>YtcqVo8UQApS$Y+@|T26`GXvqmYxDZS1#%6jUdSwsbVU>z0T3o~a#(nwap ze>t!9Gj4}{33eE4G391G<(bugBJ!er_|2-1TO+g4>*qx$&;ppz<(C}~owL8mXvMzI z4s3osm3*h*HvPj)>nsFhNXEU~KCFrtNu~MPc?&nqBdkJX0Zfx&FwIe3c*TG-?>A%5 zjb9Hlsq`j(nb?2U*yD7+surPFmPx$jEDQ!e-l$UGRwG^ zqa59Hlr_*V`_d=A2LB^_9GQn%Z~uwD*#lKH8J*w%@~6fJc4mOb?RV}u#?UXyLOuZP zan73cq4NV3pB9!U6L$^0-HL+kw8f9!0&hgxwEIES7L~FEw&eNoLjca z%>t{s%NGs@!l>6Cn5?E$7wGEhwXW$6b+ub>fI*r*f?>9^XVbRD+e#et<6xw-J7Deb zb$0cI0_AfgS9^OX5Dr@x1g)EWVQWvXwX@r|DX=&k@JBj(dnBuMb!RBj=j*zyFA&bW~(1RN?L8(7i=fI)}Adr zz1w=M!Em6jz1PZqKk^Y@`e8HD>+kKdZViOO1X$2sFo)5ex=veX#2W708BlPYm}PC; z=xjSa@o>t@>gsZ9erHK($>LydxO4mB_HDjU$Kp_6t8J0Bs;{#PKc4Qe!cr^OEM5ak zf&X0)eWBG+P+CwVNmJLizgPXTg2MmF`oF9EAJ+ff+W$lQ{bB9*yY|07bo;$O`6;ea zq8q|j_DIs69QL#YgMIkte}@I|lRrzQoz0SIm&J5#hS|Ii4Vn)qEuNqGW<0)vFkG3I zXi9aawR=vcrFtaO>`JfBwAA7R&+nkP4*6HW{RmAWf!m)_H8-vHzSMio(X^D#IU}y4 zu4As}LA*LW<%{~uUAjwDw;?}-Jo;Qb{vkn4XE=aoU44?_ohb8Df>xi5}E8k6XLVLTbGEJ(n`fs(x-Zq zGe+Za+@@>vJ6SbWRsrzUD94ZOT6u$3z5(F$Y3lDnc`nL{k1GFKUVkdRmA1`8y|0LR z)V8*i2Swvnr8i|-T-3NkgWC2maIYg=*tJE#=`z`GNDj)60>7FNfZvLCs7v2SuEL({ zslf3x%0EfvieI&ZHMvuDdO)1jP`lzjR_a2|e?A_^0t!o0=|#B2I|H~_24sm~SQbT6;23XRHQwQ=Pz&$vsvQqz~mIF=FeJ%1Uz#$rxrs7k9 zGQt@H?qh_g^f}Ro13GbaJ-SNie;ZKEc_JRaFR?z(r{byj;lrr&iNrce+-TRr2I)$E zcmcT4L|oUsskKpaBNLC@-kqMZPQ7rkcGyjIzZH+)pIEOZn%X?)`4QAunVzz8&Ir|o z%}Az0$cKUdU?RS64#!BTV<*+q#1*nT*>c{uMW4Yr!EDG@z*t|Wb7YDuivYvgBeVIv zDXz?nXzGp;wBk{;b34G~M|Hq?Sm5*%&V8w_%xnb1%z4o?bX|E)<~)SuY*fl{9Yf{k zGtE`$Dd>9h+)3bSL~e##oq$Vvk0I{{AF?y|CwFFcg9r((^t&=GAcanBMe#ex2Z2jE zaonak%I9*^8k@4=SokxMLP#=t}>&)0d>!!?oG+`*KqpO zS9b&F0&rRg$D5h46>(-I+J&wkMw#PC<`e9O3(Y!-#ha+~L5X2V<=FqZ}9 zLd&Pz2@pCC19<>i2{UCwC>3W)Kc=>&_C5%H7UG9Aj~@*2QNi7pfIA&N(WQJE_*WC6 z(l7bYLy#Fug+V@-gXtv7`M6$$Y(oxWZdZXLypita*&;w>b7v20TLOQW{#RO{eYYm| z+J3b89<+4=Y!omDU@s)Vvhl3AM+%RL-o#jzB*3HeUs5b{3c zFCc#z`3UkU}GKt6~(jC>NA(!b+)0r_3zIeR7P3gl~$ z^Nt20be_SQfdn7*ZaZ|cPP{wlB68EUe(*)*A=Mq^|W^dT$1D_7!eoC zhLZHB1o7^`3TAf;Ru*01+Rm;3ok2PFtxtd*Df>!|IehdWyq#L2rH1?z8-&o5f6lD}aX^hv}@x z-yM{GY~I=t40ZNIIwa{QW_f*sx3??oZmMne_IhPE`eHi4BBh3nOnvu;=Y!9s=I-!Te<;E!Re;W98M=id?f#o@UR$Kfx8?wD<`?>8co5h}E zzuDes|Ac+7{VVoo?Z@pW?Z32}3)2fPFDxxwQFu#XxNv9TKNl`^+~xR$<8H@3$EO_+ zIKJTcJI9lbuRBH^FFJnWc-`@?R)=#(tS%mzcj7XT3T7!Rl2kEE2S@$o-Z|( zeXOjitg&o$*_N`q%l@M5K-n{8uav!B_D0#ovaIs?vt+?MnGt9B&*sirLur0Aw+dQ_p_8aU=?8Wv9`(N4r-u`v_5&LWQ zH|(ZDOW{?83k#PPRuB1itURz`@T2bUKYANy;{bkWtioRBK zh2t8>jgFffg^qGZmE#sivtzxZ4J{Nx>l}1E>Ht$4?%i;(;3zry+Em0Av`6f?9^%&- zwp`nMD&Nnq%{GfI!{wYt34!h%AFWZL~B#4i5Bl-Wcj)p#BTQdt*wNBVjKm74-Rfl#L(m%fmHb0x`O zUA#&8-v~Sd*!^|ow@RT$z2FaA#xxKVRrbfXkLwhGyec8W0W`~%k&uDMiSC1U6zFAs&7qTCC$-_ zo82z2x3OCGG+pLSGCr=THJDDYs<<;Ps2*t)eJf2 zYB){JjrENyTitT2mx^IBx0I{ah}p-#32Y-;t^$*Y*HrOP!i(XU67 zqg1*=1J^XRRw>{sHL!x+*d)!=r8k<|>+SZ2Z7Efb?bd|oe+1=9G z+~AcyqJe80Tbt!uTG80`o>iU}DOW2(bG58-HAB{BcdZ+qLYAp=H@Is()$nQQY7Mo% zx=FavH5w3&R|8Adcxu;4*J@xgmZzb*#$7GV*Pv)&_eyuOTvLl0Zq@)^={l{vv8hFN zt!$P4L<6~2H+pKw?s9Eov+Sy=X_l_nO1<@sYh(}F9e-986;ew`)+vfhr5m&oP8R5L zV-x(JXje0TxKYCq&EjoohE324AJvM`tz7kFUa8roL7t6LhIJ?q^vcRgv5R<;rzfo{nHlT6Xfi_TInE!Hpy*xI02 zrM?kvf#&qAf)5o;h2;f5^jCqlM32_ws=gKW6|LZD@HVKJHa%v`x+ZtM+v`O$fSy;f z>x)Sin_RU{Zd%*eEEQ^n^qtZor@6!71UQ~lsUfsBARO0I*Qs|mNXxYXZ=I*M z#V)PTAnV=KvDUU=WR*Fuh8k%&aRf%IG$Qnio1S-8c8T+U3-;XUhQ$o@SM?vqK3v6n7GO1X?7u^OV1}1DPuLw2KcCZG_h1jdK>Gw z(y>X3>O6e>Kb}w~6eBxIClcV?vFaPeaORc1l~72&w6?l#WtH^pBq%hq;rTPo!lVy( zI|?<@za$j#P$_&80iDXfV<@k6)q@*mKP;A3t@21OCg6zq1;&^f4;!@5QWSm05^%Uh zn5#(NO@Je)vbMcVnB`n3Z~}#aN~Y@J(mMKj{Bkf7 zl2UK_3^bo*{ww^QZHeOVKOkRLhnp#rG)Ia`y;sX$dl63m*WzRZw6j^ zdU^V?G!wqbWX_jTE%WihdfHVu0W{qM=&UT@)5+`{>En22#bPpft|au!Zjd}zF2U@7 zj)SA8d9GY>HNNxqVfuqvAPmkaQX~GFOmAn-#a|Px1CaZ^pZnf~B>+iM*8tc`LRt!~ zC8YkX$#mn5>u$Aes$93uwq*H@H>Q}tpo zhFzKF=l*Zl=Kq401s!-c28z-;@4I-jc9RJ||Ko8HtYqm@lejX$J5u2zlcfy+I*|#7 zccZ%m8jUKc?EFvhcOwcJ9R?Y~Un>@uc`fC;m{de;QcW_-is({J$~Q3yKzt^XNBMpw z;V|x|$=9#{AIdQ%v(HhcG906Fhfux?VA3Gf#NLL$nLa%uE{RL3=`8;0`6+f@h!SDv z9h+#Gb204QhBqmDxW%7Gxl%h-l6%{j35k|w!yn*^22G|rj*|4B$QyygY-m(~;rteV zvq3~}XI_hBz6|yBL-7Z(vnruUPlK_>AF_|CmuVxeNO~;dYkA!>vKZVv|@^mgR`QL$-Zh;BXIL z0L;gAkkx>^qCyl8=ak9v`@j{mqJ;E8EU(IJGK#2JwH>s%RWlQ~@Y4b|^5JPpgaD#2 zT`zbC2%OH;y`Tm-tGpreC0a+4t? z$3b4;i0|ndDccN`>04EL%GP8^$vjBNahx3iU!=fh0}4h;CZXUZfigi=nU^jy@H&%B z*)cyEQgTYwVrpI%1F!i8USr9W9T~}xl3nkESGIvyo`KitWXg_t$&ixA-UqK-123zA z*QsR64*JNmt_4emrsE~XIC{r~M*v@hKia4t<+?zXxK9;DWjvxu&rqIGa3sZ_c`bN? z>4)H^Y zCzY9S27%Kga8mGWth~Kl_OVZ3ll&NS8DuAW6Np2o)_&9)Q)?OR^F838I3X$aAsW;I zliE;xW!s8!Zl7$N=@WesJ8x}$4aIpT&m^-Hfm2Om@02*=3*iyqaQ`6>A%kg&)2UgX z50FMjE2lGo#q#W~Wo)fLGr7_3Oz#oR^*t z!04yIak*S{J{1m?vDw8men>bplPLubaY;4pqQA&mQhfEF0ph;ur)R7K+XI@nD*khZ zc@)vn>MLg-#D8q4G*$oNcCKDe@=j?(=3~{&KGWlP){}?62ab!%r@}!Iv-3OC*jcgR z5#VwgvL^y$%-n+b_J(T6e}vt*4Xs!cB+AD04ZtrLdah=9yx5eKF3s{ruOqVLQ5A3y z-s7g8H9etvloK^@k&qN?yaX7x2LCn*9-_cA_^L6a7s&!JJB?qHc@&ZS5pXstI0TU1 z1f=06OQ3icH`$Xr17qvNoVk>TV6;!trEf9BlDpPev={xka@#HuP~6WyEXlQO5> z4luXsn|cIsMV8<7J}mz$Xu|vQ{eq%KPOL>$QH-$89A;WR517l6Rq zD}owOD3*8BeqNqNV zUW&}uC(0bz9BNOHnFwZr0GHW1smz441UQc>@(@5;jw@9{23bWArn^;GZwnv?b+tZ) zD;vJ5ulX3!7*ioe8?Hn{e3a2w{wOxod|oNhjz$|=wZeomvLW65K?vwR^+?nX9BQdl z(`o#rGc750UZ~oc%Dze@)uiYZgwXHh8}CQ2VNmD3q4!gTA?fw(GYTq~uoFS%{((V@lIi!PFAj<_EmZJHl3Lb; zkQ_1zFL9TBC+P4|ufw+`01`>*88QqKjS#6Ox@Qmo0*Z7@fG}VIhsHKz`d5KNYY(X= zdSDcc6O!T^!;0>vn-WU-=}h{@kA*z6u9<4G;;*syUJy74iNK*bs2)e@xiso=8*0DW z0huL5uk)&2N{M!yNxi7OsFiqo{Ra+035^}Tpv-3=yuHE+CE6+3$BIjCpIn^j+lw%% zO{pb$n|^^nhD6bi`qxx_P_f}BRU6{Rok?b}zXh)g%!Y_;Mp4w+4#%PPq8W%j&7_@4 zuU*sVMV#qQd=WYzM29?!@K-OmqWiBCb;q0Np&k0ze;N4Dl##_=JqZ-h>H*)YjpO`& zbbt1J=)QJ3-G$8AOfT{eL+hxsFE!4qu~#yz!9EMS=%SzFA}phWlr*Cu1VnJpy(I3Z zp}UT9@%;wwV+QUtr`2<}UJ`fu1wqgK2?O^F2JTLS?)jI*{S^cEhYZ|L8Mwb|(A{=P z+{X>v4;r|iF>t@ep!=n9KWpH=-@yG91NSQo+)FP>_frP$Lk8|I7`Xqt!Sc>a;(p%1 z{ZRw=vj*;Y2Hoo}iTfD?_lFJK>25&RFG}Xj5chWs+z%VL|H{C<&cMCtl6227#Jb}K z?&f4jNzlN3?Im%)V9@=sWL}POgYE?e?i(+O`>zb#4;i?hH*ha8aNm4M+|35d4;#3@ zW8l8Qz&&_L-02rpoj(_k8o1MhLWfh*p>Y>8d|EA?YKFhL2j9;Up|fQ z%B<=4sF%Z{ST$*FkhD{@c;UTqmeMca+&=o}G8i49`}Nc4uC#j)6}bN>?e0*xtFy}A zqkRhDV(;1Rn#_vD5@Z&-FP=vCKSaA9SM@^oOiGFtf38@5YTsBos>DMR-Mi_NayK!d z>W=4Kl_$9Hts&)};#$zyi$*6&c+a{C5W2%dMFCj~$Zpo(t+;d1^P#KXrwxf8-ASo3 zo9MS6y-|-%z52gCx-5lBJY zY~X&-z`byWbf?|9bXF~HF>oI;a6d9bx;=b3wz23lmpMm=qX2|kG2JUMO-0wGVKQ%+#cNw_X7`X2?a1YH8 z_uU5Wbq4Nx4czz55cm5H+&37wKV;zk`V4VDXyD#u;QpwAd({m2{G$f$K?C>44BR)& z5ck6d?z;`#pEYnlI78gG8@M|S+;KWyOszzpgBuz`EKf%|>~_iJW|dzXQG!kr7h^K}^RZc3~(Wch~- z+&3C@f7qb=yBc@#d?xuS48k(r#{ty}+>LUGn6DP1Sn(FF*ZcWxw2UuLBb3J zq{~ptmW;D>ZL;o;ykwl>@npzShjN!q>PS)0phVBu!zf4(knY${T7!JmfHNi_RD;+0 zkpbs*Kn{sJ4*tY%r|e_TCt6r7Y;zU};EexXfZxAxE=j*dEoF|xAy+|ON}4={fE*Nh zaU9w_SDD*z$Qnbft$-+VKaMj9$RZt`e*i>zyMg0;P0*p|S2^SaAY*V0QkX;N$#kW^ zbI7j&QT&iYa>)gdG%f6aC_ct<+<-i$%0o{?cgcQs56dk^^_vZJ?jlHbBIPKr*VH85Ht>J56=DDfDj*z*AD@?UzG<%($96ZxP&_;tFBfYIFvXqdViZfV(es| zptN!pm~`nV+lZ}Ni_YkA)_fc_JFf@iVO^~bK=`{13gu4$LP^u~Gk}chYW*!B{AmQ# zGF<~~6ep#psg|ylj{=gfqw^C$C}|SD0Z0qlp5g|#>Q&@8y4EQGm0wfPOBs#Bk4v^D2?iM^OqT$Fv_9Qj? z?VZh=I;PrPHc-|iybq9kHEzh_1v?oXt#!T$9P(A}&$5gqQ_*ut0xt6j;56wZ{0~4% zb#}f0$bJ6)IKKssHsTZgbb5#eNweYg2FOxC9#Sb2cAWv|PCzcQ=%?uZ zAj8Q{pnM1rEou>+BMc`olDr5AI#WWe9|AJ0<30h%Ar&I?Pwz`>b(;Pcqs;BcZFmJe zPQ{W{>SSxMAd!?l4xF_rWh$%#Bv(hd1rYKCqRJ_E17gLM7Lj%WLWx_I+PzcW$)3>G z+WoUS9K!wwL5KG*S!@ju)NwyzsP!WQWHuu46FM!f1SF_~lmfz^Ekt{ov;g_i(cI7~h4g+1 zK1zz&MFbxx-5h8qKuuTID!elSG%vlt*%y?IAgasX0rR+A;!T3QojZ3Xhz&~aI=Qyl zwaSf86|VF&ATR@VOSSsxB3$9km!yrM35TG`+dc!1y*TPiWo#%yufEZ>!!E-mv5zv> zjcvKYc2$4E;RVUpRXZB!$qz+cnKmTiJ15ol zhLnwpCMo6n5+xCLZx4`spwZ-3g#*A7Zs_e%eA3e+_E};W8s|VyU$@-Z&3qbjZLOYlb{fV_K2vVI37r@e%}JJEbsud*fa?yzarkcZVh1M1f2s|e7!6iQ*<4A`K;x?WTshHC zrr9}4qaheGZMelbX&7b`ygCr#!xFkmM=vz%>4sg@U6OE4u~XF)Cfz%WP$u0rjMar`44@q zTJG&20sUJjjCFUiHj?!PA-vubf*#~@-M+heLo|ql*>+&^R=hooEx5Ql;+-~H*h;Vf zgLEc9xIMKUvtTrV!*5@xQ|j7{Ych?08QP2wYBXMTMZ)d)?6{15#QYRHICI*R3(Yq9 zrdY&Zw;!6;I$~Olx|6%Z=I-8hgxxlb;3_Y}P_DQRo-IqT$~2uz>FY|9Y!3K>iA^Qk z9@bNsLIeE{apeA7E*V4nwnEv?JOVqUv54ByXVbeeGZUzw|0#RGIkD-P0aCCn;M-Dw zy2JC%`;>UMObH`*M7 z58L^SyF4E>WDHH4dT7WdXyX2JT6-r)Dvzs0m1WvssD%OYm82km&VfzcL{t<$uluMa zs_+RJ`-l}V$yF3YRozS3ObwKirZh=Y7uFN~Dl>{^7?T6rnHdq6CowLdQ+6d58X@^5 zY#IluLKrQW!1G!EqOH7=et~UN|350qAT{!naYB55TJv{B? zC_HNTfFj7?(IRPTeiy0Vggd#!Ni9Nx_OiX3rN0?XLMpT4CWdemI0p0vbbA`ly zHR*hI>M3jTK!h=PlD%QIer*_`llM8D?*2rXLaECeq#FCpf!)0FX?tH7D?o~OPBy_y a_Rsg2w_w48t;frnU3ur9K7fhe*8UqELe2gF literal 0 HcmV?d00001